2015-12-17 3 views
0

J'ai écrit un script pour pousser .EXE vers plusieurs serveurs distants à travers les domaines et les installer. Lorsque j'exécute le script, il tente d'exécuter le programme d'installation sur ma machine locale. Toute révision et correction à mon script serait d'une grande aide. MerciPowershell Remoting ne fonctionne pas comme prévu

$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

Start-Process s'exécutera toujours sur la machine locale. Vous pourriez vouloir Invoke-Command –

+0

Merci Sami. Mais la fonction est appelée depuis le serveur distant. Donc, Start-Process le déclencherait localement, n'est-ce pas? Mais néanmoins, j'ai essayé de le remplacer par Invoke-Command mais ne fonctionne toujours pas. Je reçois ci-dessous erreur: – Karthik

+0

Vous créez une session, mais vous ne saisissez pas ou appeler la fonction là-bas, il est donc appelé localement –

Répondre

1

Cela semble plus compliqué. Je ne sais pas quelles sont les limites d'accès à votre environnement a, mais je voudrais essayer d'aller de cette façon:

$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 { 
     $_ 
    } 
} 

Au lieu de coder en dur un nom d'utilisateur/mot de passe, exécutez le script avec des informations d'identification correcte dès le début.

Copy-Item devrait créer automatiquement le dossier temporaire, à condition que le nom d'utilisateur/mot de passe a accès à le faire.

Invoke-WmiMethod commencera le processus sur la cible de $, encore une fois fourni le nom d'utilisateur/mot de passe a accès à le faire. Invoke-Command fonctionne également (comme Sami mentionné).

+0

Merci pour cela. Oui, il existe un verrouillage complet entre ces domaines sans approbation activée. J'ai essayé de contourner en utilisant le compte de service qui a été ajouté à la liste blanche sur le domaine cible. Votre script aide. J'ai essayé d'utiliser Invoke-WmiMethod et ci-dessous est la sortie I get: __GENUS: 2 __CLASS: __PARAMETERS __SUPERCLASS: __DYNASTY: __PARAMETERS __RELPATH: __PROPERTY_COUNT: 2 __DERIVATION: {} __SERVER: __NAMESPACE: __PATH: ProcessId: 1040 ReturnValue: 0 – Karthik

+0

j'ai essayé plusieurs façons de Invoke-WmiMethod ou Invoke-Command mais soit jette la sortie ci-dessus ou ignore tout simplement la ligne. Eventvwr ne consigne rien non plus. Y at-il une raison pour laquelle il n'exécuterait pas l'exe? Je peux faire PSEXEC mais je voudrais rester fidèle à l'approche native de PowerShell. Tout conseil serait d'une grande aide. – Karthik

+0

La valeur de retour '0' signifie qu'aucune erreur n'a été rencontrée. Sur la machine distante, pouvez-vous voir que le fichier a été copié ou que le processus a été démarré? Peut-être essayer notepad.exe pendant vos tests. – xXhRQ8sD2L7Z