2017-04-11 2 views
0

Je veux exécuter un bloc PowerShell qui enregistre la dernière date patché à une variable d'environnement utilisateur, mais j'ai essayé à la fois cmd.exe et powersehll.exe, seulement vu les processus dans le gestionnaire de tâches de l'invité, mais rien n'apparaît dans la variable d'environnement.GuestProcessManager.StartProgramInGuest ne peut pas exécuter bloc PowerShell dans l'invité

Voici mon code:

var userName = "name"; 
var password = "password"; 
var programPath = "C:\\Windows\\System32\\cmd.exe"; 
//var programPath = "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"; 
var arguments = "-command \"powershell \"[Environment]::SetEnvironmentVariable('LastPathedDate', ((Get - HotFix | sort installedon)[-1]).InstalledOn, 'User')\"\""; 
//var arguments = "-command \"[Environment]::SetEnvironmentVariable('LastPathedDate', ((Get - HotFix | sort installedon)[-1]).InstalledOn, 'User')\""; 
RunProgramInGuest(vm, userName, password, programPath, arguments); 
private void RunProgramInGuest(VirtualMachine vm, string username, string password, string programPath, string arguments) 
    { 
     var auth = new NamePasswordAuthentication() 
     { 
      Username = username, 
      Password = password, 
      //InteractiveSession = true 
     }; 

     var moRef = new ManagedObjectReference("guestOperationsProcessManager"); 
     GuestProgramSpec spec = new GuestProgramSpec() 
     { 
      ProgramPath = programPath, 
      Arguments = arguments 
     }; 

     var guestProcessManager = new GuestProcessManager(vCenter, moRef); 
     var pid = guestProcessManager.StartProgramInGuest(vm.MoRef, auth, spec); 

     var result = guestProcessManager.ReadEnvironmentVariableInGuest(vm.MoRef, auth, new string[] { "LastPatchedDate", "TEMP" }); 
     guestProcessManager.TerminateProcessInGuest(vm.MoRef, auth, pid); 
    } 

ne sais pas où le problème est, ou il y a une autre façon d'obtenir exécuter du bloc de script et obtenir la valeur?

+0

« -command » ne marche pas faire ce que vous semblez penser qu'il fait .. si vous ne faites rien « dir cmd.exe » arrive. Je suppose que c'est pourquoi votre variable d'environnement ne montre jamais que vous voulez probablement "/ k ..." – BugFinder

+0

Merci pour votre message, mais cela ne fonctionne toujours pas. le seul chemin que nous avons réussi est la politique de puissance ouverte ('set-executionpolicy remotesigned') de l'invité, puis l'utilisation du shell de puissance exécute un fichier.'var arguments = "-command \" [pathoffile.ps1 \ ""; ' – even

Répondre

0

Enfin, je l'ai fait fonctionner. Le cmd.exe ne peut pas exécuter le script, mais il powershell.exe pourrait. les arguments qui fonctionne est:

var arguments = "invoke-command -scriptblock {[Environment]::SetEnvironmentVariable('LastPatchedDate', (((Get-HotFix | sort installedon)[-1]).InstalledOn), 'User')}"; 

Une autre conclusion est, lorsque vous utilisez cmd.exe, vous devrez peut-être mettre fin au processus en fonction de votre paramètre. mais le powershell.exe n'a pas besoin de faire cela.

guestProcessManager.TerminateProcessInGuest(vm.MoRef, auth, pid);