我试图用PsExec在远程计算机上运行一个脚本。
C:\static\path\to\thePSTools\Folder\PsTools\PsExec.exe $IPAddress -i -s -u $Login -p $LoginPassword Powershell $PathToFile但是,在编写类似于上面的代码时,我只能运行PsExec命令,这意味着从绝对路径运行PsExec。
问题是,当我的程序安装在另一台机器上时,我不知道我的PsExec的静态路径。所以我需要一条相对路径。我试了几样东西,但都没有用
像这样推送位置:
Push-Location $PSToolsPath PsExec.exe $IPAddress /accepteula $PathToFile或者类似的东西:
$Path + PsExec.exe $IPAddress /accepteula $PathToFile但我不能运行它。
我知道如何获得相对路径,但问题是,如何运行,甚至可能。
我愿意接受任何关于我的问题的修改。因为解释起来很复杂。
发布于 2021-09-10 06:40:30
不要使用PSExec。PSExec虽然有用,但它是一个用于在WinRM上运行命令的CLI程序。PowerShell已经内置了PSRemoting (WinRM是PSRemoting的主干),您可以使用New-PSSession、Enter-PSSession、Invoke-Command等来访问您控制访问的远程计算机:
备注:默认情况下,必须使用服务器名连接到服务器。如果服务器不是域的一部分或要使用IP,则必须配置本地
WinRM设置以信任该IP或服务器名称。或者,您可以配置WinRM over SSL以避免通过IP信任服务器,但是客户端服务器需要同时信任WinRM over SSL提供的证书,以及Subject或Subject-证书的替代名称必须根据您连接的名称或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,也适用于运行在Windows、MacOS或Windows上的任何程序,因为它们的根或影响。每个人都共享PATH概念,如果没有这个概念,您必须知道程序在磁盘上的位置或“您没有运行它”。
psexec.exe必须存在于定义的目录之一,$env:PATHpsexec.exe C:\path\to\psexec.exe...\..\path\to\psexec.exe.)开始。
如果您不知道程序在哪里安装,并且它不在PATH上,那么您唯一的其他选择是从媒体复制或下载它,您知道它将存储在磁盘上。
好吧..。我撒了点谎
有一种方法可以定位psexec.exe (或另一个程序),如果您确信它存在于系统中。您可以在文件系统中搜索它。你拥有的文件越多,你的IOPS越低,完成搜索所需的时间就越长。如果找到可执行文件,则可以使用call运算符&执行它。
警告:对这种方法要小心。如果存在多个名称相同但版本不同或程序完全不同的可执行文件,您可能会意外地执行错误的版本、错误的程序或最坏的情况,恶意参与者可能会放置经过修改或伪造的
psexec.exe,以窃取您的凭据或以其他方式对您的环境造成损害。,你被警告过了,。
如果您走这条路线,请检查您搜索的程序的已知校验和。下面的示例不包括此内容,但您可以使用Get-FileHash获取已找到的psexec.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在searching.时遍历子目录
- `-File` only returns `FileInfo` objects- `-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的第一个实例赋值给变量。如果使用此解决方案,应该实现一些更安全的检查,我只提供了这样一个示例,以确保在使用&.$foundPsExec有值执行时只使用一条路径,并使用绝对路径运行它(这是用FileInfo.FullName引用的,因此是FullName属性引用。https://stackoverflow.com/questions/69128000
复制相似问题