使用C#从PowerShell返回数据 [英] Using C# To Return Data From PowerShell

查看:473
本文介绍了使用C#从PowerShell返回数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将PrimarySMTPAddress返回到变量,在Powershell中,我运行的代码是这样的:

I am trying to return a PrimarySMTPAddress to a variable, in Powershell the code I run is this:

Get-Mailbox -identity UserName | select PrimarySMTPAddress

它返回正确的值,我想在我的C#代码中获取它,我已经完成了以下操作:

And it returns the correct value, I want to get this in my C# Code, I have done the following:

string getPrimarySMTP = "Get-Mailbox -identity " + username + "| select PrimarySMTPAddress";

var runSpace = RunspaceFactory.CreateRunspace(Utility.CreateConnectionInfo());
runSpace.Open();
var pipeline = runSpace.CreatePipeline();

pipeline.Commands.AddScript(getPrimarySMTP);
var primarySmtp = pipeline.Invoke();
runSpace.Dispose();

我希望它会返回相同的数据,但不会.我只是一个例外:

I would Expect this to return the same data, but it doesn't. I just get an exception:

选择"一词未被识别为cmdlet,函数, 脚本文件或可操作程序.检查名称的拼写,或者 如果包含路径,请确认路径正确,然后重试.

The term 'select' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

这是从Powershell命令返回值的方法吗?

Is this the way to return values from a powershell command?

推荐答案

感谢您提出这个问题,它帮助我找到了所需的答案.我的代码导致在Exchange 2013环境中使用RemoteRunspace进行以下操作:

Thanks for asking this question, it helped me to lead to the answer I needed. My code resulted in the following using RemoteRunspace to an Exchange 2013 environment:

    try
    {
        var target = new Uri(Uri);
        SecureString PSPassword = new SecureString();
        foreach (char c in ConfigurationManager.AppSettings["Password"])
        {
            PSPassword.AppendChar(c);
        }
        //var cred = (PSCredential)null;
        PSCredential cred = new PSCredential(ConfigurationManager.AppSettings["Username"], PSPassword);
        WSManConnectionInfo connectionInfo = new WSManConnectionInfo(target, shell, cred);
        connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default;
        connectionInfo.OperationTimeout = 1 * 60 * 1000; // 4 minutes.
        connectionInfo.OpenTimeout = 1 * 30 * 1000; // 1 minute.
        using (Runspace remoteRunspace = RunspaceFactory.CreateRunspace(connectionInfo))
        {
            remoteRunspace.Open();
            using (PowerShell powershell = PowerShell.Create())
            {
                powershell.Runspace = remoteRunspace;
                powershell.AddScript(PSSnapin);
                powershell.Invoke();
                powershell.Streams.ClearStreams();
                powershell.Commands.Clear();
                Pipeline pipeline = remoteRunspace.CreatePipeline();
                Command getMailBox = new Command("Get-Mailbox");
                getMailBox.Parameters.Add("Identity", Username);
                Command cmd = new Command("Select-Object");
                string[] Parameter = new string[] { "PrimarySMTPAddress" };
                cmd.Parameters.Add("Property", Parameter);
                pipeline.Commands.Add(getMailBox);
                pipeline.Commands.Add(cmd);
                Collection<PSObject> results = pipeline.Invoke();
                primarySMTPAddress = results[0].ToString();
                primarySMTPAddress = primarySMTPAddress.ToUpper().Replace("@{PRIMARYSMTPADDRESS=", "");
                primarySMTPAddress = primarySMTPAddress.ToUpper().Replace("}", "");
            }
            remoteRunspace.Close();
        }
        return primarySMTPAddress;
    }
    catch
    {
        return "Error";
    }

希望这对以后的所有人有帮助.

Hope this helps anyone in future.

这篇关于使用C#从PowerShell返回数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆