首页 > 解决方案 > 使用相对路径运行 PsExec

问题描述

我很抱歉标题,但我不知道如何解释。

我尝试使用 PsExec 在远程计算机上运行脚本。

C:\static\path\to\thePSTools\Folder\PsTools\PsExec.exe $IPAddress -i -s -u $Login -p $LoginPassword Powershell $PathToFile

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

问题是当我的程序安装在另一台机器上时,我不知道我的 PsExec 的静态路径。所以我需要一个相对路径。我尝试了几件事,但都没有奏效

像 Push-Location 一样:

Push-Location $PSToolsPath PsExec.exe $IPAddress /accepteula $PathToFile

或类似的东西:

$Path + PsExec.exe $IPAddress /accepteula $PathToFile

但我无法运行它。

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

我愿意对我的问题进行任何编辑。因为解释起来有点复杂。提前致谢

标签: powershellpathpsexecscript

解决方案


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

注意:默认情况下,您必须使用服务器名称连接到服务器。如果服务器不属于您的域或您想使用 IP,您必须配置本地WinRM设置以信任该 IP 或服务器名称。或者,您可以配置WinRM over SSL以避免通过 IP 信任服务器,但您的客户端服务器将需要同时信任由 提供的证书WinRM over SSL,并且证书的主题主题替代名称必须根据您连接的名称或 IP 进行验证。 .

WinRM并且PSRemoting不允许您忽略 SSL 错误。

# 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,而且适用于由于其 Unix 根源或影响而在 Windows、MacOS 或 Windows 上运行的任何程序。每个人都共享这个PATH概念,没有这个,你必须知道程序在磁盘上的位置,或者“你没有运行它”。

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

如果您不知道该程序的安装位置且不在PATH.


嗯...我撒了一点谎

psexec.exe如果您确定系统上存在某个程序(或其他程序),您可以通过一种方法来定位它。您可以在文件系统中搜索它。您拥有的文件越多,IOPS 越低,将延长完成搜索所需的时间。如果您找到可执行文件,您可以使用调用运算符执行它&

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

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

$foundPsExec = Get-ChildItem C:\ -Recurse -File -Include psexec.exe -EA Continue |
  Select-Object -First 1

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

请允许我从上面的示例中解释一些事情:

  • Get-ChildItem将在文件系统中搜索您提供的路径中的文件。
    • -Recurse将允许Get-ChildItem在搜索时遍历子目录。

    • -File只返回FileInfo对象

    • -EA是 的简写-ErrorAction。我们希望确保此行为设置为在此操作上继续,因为在搜索整个磁盘时,您一定会遇到一些权限错误。

      您可以改为隐藏它们,-ErrorAction SilentlyContinue或者让 PowerShell 使用-ErrorAction Ignore.

  • 这用于Select-Object仅将第一个实例分配给PSExec变量。如果您使用此解决方案,您应该实施一些更安全的检查,我仅提供此作为示例,以确保您在执行 with 时仅使用一个路径&
  • 如果$foundPsExec有一个值,则使用绝对路径运行它(这是用 引用的FileInfo.FullName,因此是FullName属性引用。

推荐阅读