2015-12-17 79 views
0

我已經編寫了一個腳本,將.EXE跨域推送到多個遠程服務器並進行安裝。當我執行腳本時,它會嘗試在本地機器上運行安裝程序。對我的腳本的任何審查和更正都會有很大的幫助。謝謝PowerShell遠程無法正常工作

$uname='domain\username' 
$pwd='Password' | ConvertTo-SecureString -Force -AsPlainText 
try { 
$targets = Get-Content -Path D:\scripts\serverlist.txt 
$source = C:\Downloads\installer.exe 
$creds=New-object System.Management.Automation.PSCredential ($uname, $pwd) 
[ScriptBlock] $code = { 
    if(!(Test-Path "C:\Temp")) 
    { 
     New-Item -Path "C:\Temp" -ItemType Directory 
    } 
} 
    function Installer([string] $file, [String] $argslist) 
    { 
     $ErrorActionPreference="Stop" 
     try 
     { 
      $exec = Start-Process -FilePath $file -ArgumentList $argslist -Wait -PassThru 
      Write-Host "Exit code for installation of $file is $($exec.ExitCode)" 
      return $exec.ExitCode 
     } 
     catch 
     { 
      throw 
     } 
    } 
foreach($target in $targets){ 
    $name = GC env:computername 
    $current = New-PSSession -ComputerName $name -Credential $creds -ErrorAction SilentlyContinue 
    Invoke-Command -Session $current -ScriptBlock $code 
    Robocopy $source E:\Temp 
    Installer "\\$name\$source" "/q /norestart" 
    $current | Remove-PSSession 
} } 
catch 
{ 
Write-Host -f red "An error has occurred!" 
Write-Host "$($error[0].exception)" 
$error.clear() 
exit $LASTEXITCODE 
} 
+0

啓動過程將始終在本地計算機上運行。您可能需要Invoke-Command –

+0

謝謝Sami。但是該函數從遠程服務器中被調用。所以Start-Process會在本地觸發它嗎?但是,儘管如此,我試圖用Invoke-Command替換它,但仍然無法使用。我得到下面的錯誤: – Karthik

+0

您創建一個會話,但您不輸入或在那裏調用該函數,因此它在本地調用 –

回答

1

這看起來過於複雜。我不知道你的環境有什麼准入限制,但我會嘗試去這樣:

$source = Get-Item -Path "C:\Downloads\installer.exe" 

ForEach ($target In $targets) { 
    Try { 
     Copy-Item -Path ($source.FullName) -Destination "\\$target\c$\temp\" -Recurse -Force 
     Invoke-WmiMethod -ComputerName $target -Class Win32_Process -Name Create -ArgumentList "C:\temp\$($source.Name) /q /norestart" 
    } Catch { 
     $_ 
    } 
} 

而不是硬編碼的用戶名/密碼,從一開始就正確的憑據運行該腳本。

Copy-Item應該自動創建臨時文件夾,前提是用戶名/密碼可以訪問。

Invoke-WmiMethod將在$ target上啓動該進程,再次提供用戶名/密碼可以訪問來執行此操作。 Invoke-Command也有效(如薩米提到的)。

+0

謝謝你。是的,在未啓用信任的情況下,這些域之間存在完全鎖定。我試圖通過使用目標域上的白名單服務帳戶來規避。你的腳本確實有幫助。我試圖用調用-WMIMethod及以下的輸出獲得:__GENUS:2 __CLASS:__PARAMETERS __SUPERCLASS: __DYNASTY:__PARAMETERS __RELPATH: __PROPERTY_COUNT:2 __DERIVATION:{} __SERVER: __NAMESPACE: __PATH: ProcessId:1040 Return Value:0 – Karthik

+0

我嘗試過使用Invoke-WMIMethod或Invoke-Command的多種方式,但它要麼拋出上面的輸出,要麼忽略該行。 Eventvwr也不記錄任何東西。有沒有理由不執行exe文件?我可以做PSEXEC,但我想堅持原生的PowerShell方法。任何建議都會有很大的幫助。 – Karthik

+0

返回值「0」表示沒有遇到錯誤。在遠程機器上,你能看到文件被複制,或者進程已經啓動?也許嘗試notepad.exe,而你的測試。 – xXhRQ8sD2L7Z