使用PowerShell脚本更改Windows服务

时间:2017-01-26 19:41:04

标签: windows powershell service

我编写了一个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

1 个答案:

答案 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远程处理默认情况下处于活动状态。