2012-12-17 4 views
0

내가 그 PowerShell 명령의 VM의 개체를 전달하려고 :C#을 원격 파워 쉘의 하이퍼 cmdlet을 시작-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); 

그리고 아무것도 예외없이 시작하지 않는 VM 및 코드 실행을 추가합니다. 나는 cmdlet으로 개체를 전달할 수있는 권리 기술을 사용하는 경우 알고 싶습니다 그래서

...

생각과 같은 사람, 그는 환영의 경우)

답변

0

생각의 몇 ... 귀하의 예 좋아 보이지만 어떤 유형의 가상화를 사용하고 있습니까? Hyper-V를 사용하는 예를 기반으로 추측하고 있습니다.

것들 확인 :

  • 서버 OS를, 2008 또는 2008 R2의 경우, 명령은 시스템 센터 또는 제 3 자 라이브러리 어디에서 오는? 두 경우 모두 Start-VM 명령을 사용하여 모듈을로드하라는 호출이 표시되지 않았습니다. 호출하기 전에 cmdlet 또는 함수를 사용할 수 있는지 확인하십시오. 서버 2012 인 경우 자동 로딩이 명령로드를 처리해야하지만 상자에서 Hyper-V 모듈을 사용할 수 있는지 확인하고 세션에로드해야합니다.
  • Start-VM에 전달할 "this.VM"유형은 무엇입니까? VM을 관리하는 데 사용하는 모듈에 따라 객체의 유형이 중요합니다.
  • VM 스토리지는 어떤 제품입니까? 로컬 또는 SMB 공유에 있습니까? SMB 공유에있는 경우 적절한 자격 증명 위임이 준비되어 있습니까?
관련 문제