2017-01-26 75 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

相關問題