powershell - 使用相对路径运行 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
但我无法运行它。
我知道如何获得相对路径,但问题是,如何运行,或者甚至可能。
我愿意对我的问题进行任何编辑。因为解释起来有点复杂。提前致谢
解决方案
不要使用PSExec
. 虽然有用,但PSExec
它是一个 CLI 程序,用于在WinRM
. PowerShell 已经PSRemoting
内置(WinRM
是 的主干PSRemoting
),您可以使用New-PSSession
、Enter-PSSession
、Invoke-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
属性引用。
推荐阅读
- mysql - 从包含mysql中某些数据的表中获取2个值
- python - 使用 numpy 选择特定行
- python - 使字典无法正常工作的功能
- azure - 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败
- python - 无法在 django 中为 CustomUser 模型分配 SimpleLazyObject
- javascript - 单击菜单项 js
- html - HTML - rowspan="2" 什么都不做,而 rowspan="3" 完美运行
- vue.js - 我认为方法不是反应性的,但为什么在这个例子中方法是反应性的?
- web-services - 做什么
错误处理输入 尝试使用 PL/SQL 调用 web 服务时是什么意思? - lazarus - Lazarus IDE 表格大小