PowerShell Invoke-Command/PSExec
PowerShell with Invoke-Command/PSExec
假设我有一个名为 "PCs.csv" 的 CSV 文件,其中包含三个 'columns'("name"、"user"、"pw")。
现在,我们还假设我想 运行 在每台 PC 上使用与其关联的凭据执行一个非常简单的命令。
最初,由于服务器和工作站都使用 PS 5.0(并且 PS远程处理已启用),我使用 Invoke-Command
进行测试,结果输出正是我想要的(这与我在机器上 运行ning 命令完全一样)。然而,这个问题......是我在机器上。作为凭据 powershell 使用的用户 运行 该命令所属。而且效果一点都不明显
然后...我想我会使用 PSExec。 returns 错误说明:
psexec.exe : The system cannot find the file specified.
At line:7 char:5
+ & C:\PSTools\PSExec.exe \$pc.name /accepteula -u $un -p $pc.pw "n ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (The system cann...file specified.:Strin
g) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Error opening {name=PC01; user=user01; pw=pass01}.name:
所以,下面是我使用的两个脚本...我只需要其中一个就可以工作。事实上,这是一个谎言......我什至不需要其中之一来工作......如果有其他更好的东西,我机会均等!
调用命令:
$PCs = Import-Csv "C:\PCs.csv"
ForEach ($pc in $PCs) {
$un = "DOM\" + $pc.user
$pw = ConvertTo-SecureString $pc.pw -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($un,$pw)
Invoke-Command -ComputerName $pc.name -Credential $creds -ScriptBlock {
cmd.exe /c "net use * /delete /yes"
}
}
和PS执行:
$PCs = Import-Csv "C:\PCs.csv"
ForEach ($pc in $PCs) {
$un = "DOM\" + $pc.user
& C:\PSTools\PSExec.exe \$pc.name /accepteula /u $un /p $pc.pw "net use * /delete /yes"
}
我确定我遗漏了一些非常愚蠢的东西,所以我提前为此道歉。但是,从好的方面来说——如果是这样的话,至少我们都能开怀大笑:)
如果登录会话不需要断开 正在使用 的驱动器映射,则不需要 psexec,因为不需要 运行 命令 在 用户会话中。模拟用户并加载配置文件就足够了,因为驱动器映射由 net use
(如果提供了驱动器号,并且设置了 /persistence 标志)存储在注册表的用户特定部分,HKCU( Get-Childitem -path HKCU:\network
显示永久驱动器映射,net use
显示活动驱动器映射)。为了验证这一点,我首先使用 RDP 登录到一个会话,并使用持久标志制作了一个驱动器映射。然后我用你的脚本删除了这个驱动器映射:
$PCs = Import-Csv "C:\PCs.csv"
ForEach ($pc in $PCs) {
$un = "SSS\" + $pc.user
"user: $un, password: $($pc.pw)"
$pw = ConvertTo-SecureString $pc.pw -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($un,$pw)
Invoke-Command -ComputerName $pc.name -Credential $creds -ScriptBlock {
whoami /user
Get-Childitem -path HKCU:\network
cmd.exe /c "net use * /delete /yes"
Get-Childitem -path HKCU:\network
}
}
下次我使用 RDP 登录时,不再创建驱动器映射。
假设我有一个名为 "PCs.csv" 的 CSV 文件,其中包含三个 'columns'("name"、"user"、"pw")。
现在,我们还假设我想 运行 在每台 PC 上使用与其关联的凭据执行一个非常简单的命令。
最初,由于服务器和工作站都使用 PS 5.0(并且 PS远程处理已启用),我使用 Invoke-Command
进行测试,结果输出正是我想要的(这与我在机器上 运行ning 命令完全一样)。然而,这个问题......是我在机器上。作为凭据 powershell 使用的用户 运行 该命令所属。而且效果一点都不明显
然后...我想我会使用 PSExec。 returns 错误说明:
psexec.exe : The system cannot find the file specified.
At line:7 char:5
+ & C:\PSTools\PSExec.exe \$pc.name /accepteula -u $un -p $pc.pw "n ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (The system cann...file specified.:Strin
g) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
Error opening {name=PC01; user=user01; pw=pass01}.name:
所以,下面是我使用的两个脚本...我只需要其中一个就可以工作。事实上,这是一个谎言......我什至不需要其中之一来工作......如果有其他更好的东西,我机会均等!
调用命令:
$PCs = Import-Csv "C:\PCs.csv"
ForEach ($pc in $PCs) {
$un = "DOM\" + $pc.user
$pw = ConvertTo-SecureString $pc.pw -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($un,$pw)
Invoke-Command -ComputerName $pc.name -Credential $creds -ScriptBlock {
cmd.exe /c "net use * /delete /yes"
}
}
和PS执行:
$PCs = Import-Csv "C:\PCs.csv"
ForEach ($pc in $PCs) {
$un = "DOM\" + $pc.user
& C:\PSTools\PSExec.exe \$pc.name /accepteula /u $un /p $pc.pw "net use * /delete /yes"
}
我确定我遗漏了一些非常愚蠢的东西,所以我提前为此道歉。但是,从好的方面来说——如果是这样的话,至少我们都能开怀大笑:)
如果登录会话不需要断开 正在使用 的驱动器映射,则不需要 psexec,因为不需要 运行 命令 在 用户会话中。模拟用户并加载配置文件就足够了,因为驱动器映射由 net use
(如果提供了驱动器号,并且设置了 /persistence 标志)存储在注册表的用户特定部分,HKCU( Get-Childitem -path HKCU:\network
显示永久驱动器映射,net use
显示活动驱动器映射)。为了验证这一点,我首先使用 RDP 登录到一个会话,并使用持久标志制作了一个驱动器映射。然后我用你的脚本删除了这个驱动器映射:
$PCs = Import-Csv "C:\PCs.csv"
ForEach ($pc in $PCs) {
$un = "SSS\" + $pc.user
"user: $un, password: $($pc.pw)"
$pw = ConvertTo-SecureString $pc.pw -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential ($un,$pw)
Invoke-Command -ComputerName $pc.name -Credential $creds -ScriptBlock {
whoami /user
Get-Childitem -path HKCU:\network
cmd.exe /c "net use * /delete /yes"
Get-Childitem -path HKCU:\network
}
}
下次我使用 RDP 登录时,不再创建驱动器映射。