GuestProcessManager.StartProgramInGuest无法在来宾操作系统中运行powershell块

时间:2017-04-11 06:49:00

标签: c# powershell vmware

我想运行一个PowerShell块,将上次修补日期保存到用户环境变量,但我尝试了cmd.exe和powersehll.exe,只看到了guest虚拟机操作系统的任务管理器中的进程,但没有出现在环境变量。

这是我的代码:

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);
    }

不确定问题出在哪里,或者有另一种方法来执行某些脚本块并获取值?

1 个答案:

答案 0 :(得分:0)

最后,我让它运行。 cmd.exe无法执行脚本,但是powershell.exe可以执行。 有效的论据是:

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

另一个发现是,当您使用cmd.exe时,您可能需要根据您的参数终止该过程。但powershell.exe没有必要这样做。

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