0

我正在尝试传递该 powershell 命令的 VM 对象:

Start-Vm -Vm <VirtualMachine>

我想通过 c# 代码来做到这一点。所以我创建了一个远程运行空间等等:

class RemotePowershell
{
    private const string SHELL_URI = "http://schemas.microsoft.com/powershell/Microsoft.PowerShell";
    private WSManConnectionInfo connectionInfo = null;

    public RemotePowershell(string hostname, string username, string livepassword)
    {

        SecureString password = new SecureString();
        foreach (char c in livepassword.ToCharArray()) { password.AppendChar(c); }
        password.MakeReadOnly();

        PSCredential creds = new PSCredential(string.Format("{0}\\{1}", hostname, username), password);

        var targetWsMan = new Uri(string.Format("http://{0}:5985/wsman", hostname));
        connectionInfo = new WSManConnectionInfo(targetWsMan, SHELL_URI, creds);
        connectionInfo.OperationTimeout = 4 * 60 * 1000; // 4 minutes.
        connectionInfo.OpenTimeout = 1 * 60 * 1000; // 1 minute.
        connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Negotiate;       
    }


    public void RunScript(string scriptText, Collection<CommandParameter> parametters)
    {
        using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
        {
            runspace.Open();

            using (PowerShell ps = PowerShell.Create())
            {
                ps.Runspace = runspace;
                ps.AddCommand(scriptText);
                ps.AddParameters(parametters);


                Collection<PSObject> results = ps.Invoke();    
            }
            runspace.Close();
        }

我用这样的扩展方法运行它:

public static class PowershellExtentionMethods
{
    private static RemotePowershell powerShellSession = new RemotePowershell("HOSTNAME", "USERNAME", "PASSWORD");


    public static void PowershellExec(this string commands, Collection<CommandParameter> parameters)
    {
        powerShellSession.RunScript(commands, parameters);
    }
}

var cmd = "Start-VM";
Collection<CommandParameter> cpc = new Collection<CommandParameter>();
cpc.Add(new CommandParameter("Vm",this.vm));
cmd.PowershellExec(cpc);

并且没有任何附加的虚拟机不会启动并且代码毫无例外地运行。

所以我想知道我是否使用正确的技术将对象传递给 cmdlet...

如果有人作为一个想法,他是受欢迎的;)

4

1 回答 1

0

一些想法.. 您的示例看起来不错,但是您使用的是什么类型的虚拟化?我根据您使用 Hyper-V 的示例猜测。

检查事项:

  • 服务器操作系统,如果是 2008 或 2008 R2,来自 System Center 或第三方库的命令在哪里?无论哪种情况,我都没有看到使用 Start-VM 命令加载模块的调用。在调用之前确保 cmdlet 或函数可用。如果是 Server 2012,自动加载应该处理加载命令,但您需要确保 Hyper-V 模块在盒子上可用并加载到会话中。
  • 您传递给 Start-VM 的“this.VM”的类型是什么?根据您用于管理 VM 的模块,对象的类型很重要。
  • 虚拟机存储是什么样的?它是本地的还是 SMB 共享的?如果它在 SMB 共享上,是否有正确的凭证委派?
于 2012-12-24T16:51:28.150 回答