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 登录时,不再创建驱动器映射。