繁体   English   中英

具有Invoke-Command / PSExec的PowerShell

[英]PowerShell with Invoke-Command/PSExec

假设我有一个名为“ PCs.csv”的CSV文件,其中包含三个“列”(“名称”,“用户”和“ pw”)。

现在,我们还假设我想使用与其关联的凭据在每台PC上运行一个非常简单的命令。

最初,由于Server和Workstation都使用PS 5.0(并且启用了PSRemoting),所以我正在使用Invoke-Command进行测试,结果输出正是我想要的(与在运行Windows Server 2003的计算机上使用时完全相同)命令)。 但是,问题在于...我在机器上。 Powershell用来运行命令的凭据的用户属于该用户。 结果丝毫不明显。

然后...我想我会使用PSExec。 返回错误说明:

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"
    }
}

和PSExec:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM