首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用相对程序运行PsExec

使用相对程序运行PsExec
EN

Stack Overflow用户
提问于 2021-09-10 06:15:08
回答 1查看 599关注 0票数 0

我试图用PsExec在远程计算机上运行一个脚本。

代码语言:javascript
复制
C:\static\path\to\thePSTools\Folder\PsTools\PsExec.exe $IPAddress -i -s -u $Login -p $LoginPassword Powershell $PathToFile

但是,在编写类似于上面的代码时,我只能运行PsExec命令,这意味着从绝对路径运行PsExec。

问题是,当我的程序安装在另一台机器上时,我不知道我的PsExec的静态路径。所以我需要一条相对路径。我试了几样东西,但都没有用

像这样推送位置:

代码语言:javascript
复制
Push-Location $PSToolsPath PsExec.exe $IPAddress /accepteula $PathToFile

或者类似的东西:

代码语言:javascript
复制
$Path + PsExec.exe $IPAddress /accepteula $PathToFile

但我不能运行它。

我知道如何获得相对路径,但问题是,如何运行,甚至可能。

我愿意接受任何关于我的问题的修改。因为解释起来很复杂。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-10 06:40:30

不要使用PSExecPSExec虽然有用,但它是一个用于在WinRM上运行命令的CLI程序。PowerShell已经内置了PSRemoting (WinRMPSRemoting的主干),您可以使用New-PSSessionEnter-PSSessionInvoke-Command等来访问您控制访问的远程计算机:

备注:默认情况下,必须使用服务器名连接到服务器。如果服务器不是域的一部分或要使用IP,则必须配置本地WinRM设置以信任该IP或服务器名称。或者,您可以配置WinRM over SSL以避免通过IP信任服务器,但是客户端服务器需要同时信任WinRM over SSL提供的证书,以及Subject或Subject-证书的替代名称必须根据您连接的名称或IP进行验证。

WinRMPSRemoting不允许您忽略SSL错误。

代码语言:javascript
复制
# Your remote machine credential
$cred = Get-Credential

# Run commands in a one off remote session
Invoke-Command -ComputerName $serverName -Credential $cred { "hello" }

# Create a PSSession so we can run commands over the same session at different times
$session = New-PSSession -ComputerName $serverName -Credential $cred

# Invoke-Command with an existing PSSession
Invoke-Command -ComputerName $serverName -Credential $cred -Session $session { "hello" }

# Enter-PSSession lets you open an interactive terminal within a remote PowerShell session
Enter-PSSession -ComputerName $serverName -Credential $cred -Session $session

# To leave a PSSession you've entered with Enter-PSSession
Exit-PSSession
exit

请注意,exit不是Exit-PSSession的别名,它只是在退出远程会话时和退出本地会话时具有相同的效果。

如果您必须使用PSExec (例如,PSRemoting不允许您以SYSTEM用户的身份直接运行内容,但PSExec允许),那么执行psexec.exe必须符合以下两件事情之一

以下内容不仅适用于PSExec,也适用于运行在Windows、MacOS或Windows上的任何程序,因为它们的根或影响。每个人都共享PATH概念,如果没有这个概念,您必须知道程序在磁盘上的位置或“您没有运行它”。

  • psexec.exe必须存在于定义的目录之一,$env:PATH
  • You必须知道从当前目录到psexec.exe
    • 的绝对或相对路径,您所称的“静态路径”实际上称为“绝对路径”,它从驱动器根目录开始,比如C:\path\to\psexec.exe.
    • A相对路径将是当前目录的路径,不需要从驱动器根目录(如..\..\path\to\psexec.exe.

)开始。

如果您不知道程序在哪里安装,并且它不在PATH上,那么您唯一的其他选择是从媒体复制或下载它,您知道它将存储在磁盘上。

好吧..。我撒了点谎

有一种方法可以定位psexec.exe (或另一个程序),如果您确信它存在于系统中。您可以在文件系统中搜索它。你拥有的文件越多,你的IOPS越低,完成搜索所需的时间就越长。如果找到可执行文件,则可以使用call运算符&执行它。

警告:对这种方法要小心。如果存在多个名称相同但版本不同或程序完全不同的可执行文件,您可能会意外地执行错误的版本、错误的程序或最坏的情况,恶意参与者可能会放置经过修改或伪造的psexec.exe,以窃取您的凭据或以其他方式对您的环境造成损害。,你被警告过了,。

如果您走这条路线,请检查您搜索的程序的已知校验和。下面的示例不包括此内容,但您可以使用Get-FileHash获取已找到的psexec.exe校验和,并将其与已知的正确校验和进行比较。

代码语言:javascript
复制
$foundPsExec = Get-ChildItem C:\ -Recurse -File -Include psexec.exe -EA Continue |
  Select-Object -First 1

if( $foundPsExec ) {
  & $foundPsExec.FullName
}

请允许我从上面的例子中解释几点:

  • Get-ChildItem将在您提供的路径上搜索文件系统。
    • -Recurse允许Get-ChildItem在searching.

时遍历子目录

代码语言:javascript
复制
- `-File` only returns `FileInfo` objects
代码语言:javascript
复制
- `-EA` is shorthand for `-ErrorAction`. We want to ensure this behavior is set to continue on this operation because when searching the entire disk you are bound to hit some permissions errors.

,您可以使用-ErrorAction SilentlyContinue来隐藏它们,或者让PowerShell将所有错误与-ErrorAction Ignore一起抛出。

  • --使用Select-Object只将PSExec的第一个实例赋值给变量。如果使用此解决方案,应该实现一些更安全的检查,我只提供了这样一个示例,以确保在使用&.
  • If $foundPsExec有值执行时只使用一条路径,并使用绝对路径运行它(这是用FileInfo.FullName引用的,因此是FullName属性引用。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69128000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档