2017-01-26 71 views
0

我编写了PowerShell脚本来更改远程VM上的服务的登录用户。它在我执行它时起作用。然而,当我把它发送给我的同事,脚本看来,其运行没有任何错误,他们检查了它仍被列为“本地帐户”。使用PowerShell脚本更改Windows服务

$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

这将是非常有用的知道错误是什么。一个好的起点,你确定他们有一个名为servers.txt的文本文件与你的代码在同一个目录中吗?他们的PowerShell执行策略是否允许远程代码运行?此外,你让他们输入他们的密码。您应该使用'Get-Credential',否则会更安全。 – FoxDeploy

+0

我输出'$ computer',因为听起来你的脚本没有找到'。\ servers.txt'并且认为它没有任何关系。 – Filburt

+0

for server.txt正在从它们更新的servers.txt文件读取VM的名称。没有提供任何错误消息,它看起来好像没有问题,但没有对其指定的虚拟机进行更改。 –

回答

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块Cmd的-允许使用-Computer参数实现一个专有的方式的远程动作,而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远程处理默认情况下处于活动状态。

+0

感谢您的尝试,但我在尝试运行时收到以下错误:“invoke-command:一个或多个计算机名称无效。如果您尝试传递URI,请使用-Co​​nnectionUri 参数或传递URI对象而不是字符串“。 –

+0

检查是否需要将远程目标添加到可信主机列表中。我已经更新了我的答案。 – Moerwald

相关问题