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

そして、VMを追加するものは何も起動せず、コードは例外なく実行されます。

だから私はオブジェクトをコマンドレットに渡すために正しいテクニックを使用しているかどうか知りたいです...

アイデアとして誰かがいれば、彼は大歓迎です;)

4

1 に答える 1

0

いくつかの考え..あなたの例は問題ないように見えますが、どのタイプの仮想化を使用していますか? Hyper-Vを使用している例に基づいて推測しています。

確認事項:

  • サーバー OS (2008 または 2008 R2 の場合)、コマンドは System Center またはサード パーティのライブラリから送られてきますか? どちらの場合も、Start-VM コマンドでモジュールをロードする呼び出しは見られませんでした。呼び出す前に、コマンドレットまたは関数が使用可能であることを確認してください。Server 2012 の場合、自動読み込みでコマンドの読み込みを処理する必要がありますが、Hyper-V モジュールがボックスで利用可能であり、セッションに読み込まれることを確認する必要があります。
  • Start-VM に渡す「this.VM」の種類は何ですか? VM の管理に使用しているモジュールに応じて、オブジェクトのタイプが重要になります。
  • VM ストレージはどのようなものですか? ローカルですか、それとも SMB 共有ですか? SMB 共有上にある場合、正しい資格情報の委任が行われていますか?
于 2012-12-24T16:51:28.150 に答える