我编写了一个PowerShell脚本来更改远程VM上的服务的登录用户。它在我执行时有效。但是,当我将它发送给我的同事时,脚本显示它运行没有错误,并且检查它仍然列为“本地帐户”。
$account = Read-Host "Please admin account Name"
$password = Read-Host -AsSecureString "Please enter your password"
$password = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
$service = Read-Host "Enter service name"
$computers = Get-Content -Path ".\servers.txt"
foreach ($computer in $computers) {
$svc = gwmi Win32_Service -ComputerName $computer -Filter "name='$service'"
$svc.StopService()
$svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null)
$svc.StartService()
}
Write-Host $service "is now running as" $account
Read-Host
答案 0 :(得分:0)
我会移动这个块
foreach ($computer in $computers) {
$svc = gwmi Win32_Service -ComputerName $computer -Filter "name='$service'"
$svc.StopService()
$svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null)
$svc.StartService()
}
进入invoke-command
区块。使用-Computer
参数的Cmd-let以专有方式实现远程操作,而invoke-command
使用WSMAN
( - >更标准化的方式)。
试试这个:
foreach ($computer in $computers) {
# $computer can be either an IP-address or a FQDN e.g. computer.mydomain
invoke-command -computer $computer -credential (get-credential) -scripblock {
$svc = gwmi Win32_Service -ComputerName $computer -Filter "name='$service'"
$svc.StopService()
$svc.Change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null)
$svc.StartService()
}
}
使用该提议,所有操作都在远程计算机上执行。与第一次尝试相反。第一次尝试将远程对象“提取”到本地计算机(对象被转换),而不是在转换对象上本地执行某些操作( - >已更改的属性将发送回远程)。
如果您的计算机与远程计算机不在同一个域中,则需要将远程目标添加到本地可信主机列表中。此link介绍了如何更新可信主机列表。
您还应该检查目标上的Powershell远程处理是否处于活动状态,这也在link中进行了描述。如果您的目标操作系统是WIN Server 2012 R2 Powershell远程处理默认情况下处于活动状态。