2012-12-17 56 views
0

我試圖傳遞PowerShell命令的VM對象:C#遠程PowerShell cmdlet的Hyper-V的啓動VM -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的...

如果有人爲的想法,他的歡迎;)

回答

0

一對夫婦的想法。您的例子看起來不錯,但你使用的是什麼類型的虛擬化?我猜根據你使用Hyper-V的例子。

檢查事項:

  • 服務器操作系統,如果2008年或2008 R2,其中在命令從系統中心或第三方庫來嗎?在任何一種情況下,我都沒有看到用Start-VM命令加載模塊的調用。在調用之前,請確保該cmdlet或函數可用。如果是Server 2012,自動加載應該處理加載命令,但是您需要確保Hyper-V模塊可用,並加載到會話中。
  • 您傳遞給Start-VM的「this.VM」類型是什麼?根據您用於管理VM的模塊,對象的類型很重要。
  • 什麼是VM存儲?它是本地還是SMB分享?如果它位於SMB共享上,是否有正確的憑據授權?