首页 > 解决方案 > 在 Hyper-V VM Powershell C# 上调用命令

问题描述

我正在尝试通过 C#/Powershell 在 Hyper-V 托管 VM 上调用命令,但以各种方式失败。我可以毫无问题地运行各种其他 PS 命令,此外,我还可以直接在 Powershell cmd 中运行 Invoke-Command。

我的主要目标是在虚拟机上运行/执行远程进程。我目前正在使用 {Get-Childitem C:\Windows} 的脚本块来列出目录,只是为了获得一些输出以进行测试。

在 Powershell 中,如果我运行:

Invoke-Command -VMName Windows10 -ScriptBlock {Get-Childitem C:\\Windows}

在提示输入凭据后它可以工作。

我的 C# 代码失败了,我尝试了很多方法来让它工作但无济于事。

    public static void Test()
    {
        var scBlock = ScriptBlock.Create("{Get-Childitem C:\\Windows}");
        
        // Create a PSCredential
        var cred = CreateCredential("test", "test");

        using (var ps = PowerShell.Create())
        {
            var initial = InitialSessionState.CreateDefault();
            var runspace = RunspaceFactory.CreateRunspace(initial);
            runspace.Open();
            ps.Runspace = runspace;
            ps.AddCommand("Invoke-Command");
            ps.AddParameter("VMName", "Windows10");
            ps.AddParameter("ScriptBlock", scBlock);
            ps.AddParameter("Credential", cred);

            ps.Streams.Progress.DataAdded += (sender, ev) =>
            {
                var progressRecords = (PSDataCollection<ProgressRecord>)sender;
                Console.WriteLine("Progress is {0} percent complete",
                    progressRecords[ev.Index].PercentComplete);
            };
            ps.Streams.Warning.DataAdded += (sender, ev) =>
            {
                var warnings = (PSDataCollection<WarningRecord>)sender;
                var message = warnings[ev.Index].Message;
                Console.WriteLine($"WARNING - {message}");
            };
            ps.Streams.Error.DataAdded += (sender, ev) =>
            {
                var error = (PSDataCollection<ErrorRecord>)sender;
                var message = error[ev.Index].Exception?.Message;
                Console.WriteLine($"ERROR - {message}");
            };

            try
            {
                var results = ps.Connect();
                foreach (var tPsObject in results)
                {
                    
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
    }

我在控制台中收到以下错误:

ERROR - Configuration system failed to initialize
ERROR - The input VMName Windows10 does not resolve to a single virtual machine.

我只在 C# 中使用 Powershell,因为它似乎是管理 Hyper-V 虚拟机的最简单/最常用的方法。

一个附带问题,有没有办法从非提升的过程中运行上述所有内容。例如,我不想以管理员身份运行我的应用程序。

标签: c#powershellhyper-v

解决方案


推荐阅读