繁体   English   中英

从C#运行PowerShell命令

[英]Running PowerShell commands from C#

我有powershell脚本,可以连接到在线交换并执行诸如创建共享邮箱,日历,添加许可证等任务。

问题是,当我从C#类运行这些命令时,我得到了错误。

这是我的联系:

 string schemaURI = "http://schemas.microsoft.com/powershell/Microsoft.Exchange";
        Uri connectTo = new Uri("https://outlook.office365.com/powershell-liveid/");

        var securePassword = new SecureString();

        foreach (char c in password)
        {
            securePassword.AppendChar(c);
        }

        this.credential = new PSCredential(login, securePassword);
        WSManConnectionInfo connectionInfo = new WSManConnectionInfo(connectTo, schemaURI, credential);
        connectionInfo.MaximumConnectionRedirectionCount = 5;
        connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic;


            this.remoteRunspace = RunspaceFactory.CreateRunspace(connectionInfo);
            this.remoteRunspace.Open();

这是我的PowerShell,可以正常工作:

  PowerShell powershell = PowerShell.Create();
                powershell.Runspace = this.remoteRunspace;
                PSCommand command = new PSCommand();

                command.AddCommand("new-mailbox");
                command.AddParameter("Name", mailboxName);
                command.AddParameter("Shared");
                command.AddParameter("PrimarySmtpAddress", formatedMailboxName);
                powershell.Commands = command;

                powershell.Invoke();

这是无法正常工作的代码:

 PowerShell powershell = PowerShell.Create();
                powershell.Runspace = this.remoteRunspace;
                PSCommand command = new PSCommand();
                command.AddCommand("Connect-MsolService");
                command.AddCommand("Import-Module MSOnline");
                command.AddParameter("Credential", this.credential);
                command.AddCommand("Set-MsolUser");
                command.AddParameter("UserPrincipalName", userLogin);
                command.AddParameter("UsageLocation", "SE");

我得到的错误如下:

附加信息:术语“导入模块MSOnline”不被视为cmdlet,函数,脚本文件或可运行程序的名称。 检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。

我尝试了各种操作,例如复制粘贴dll,将活动解决方案平台的CPU更改为64位,但没有任何帮助。

可能是愚蠢的,但您尝试了以下方法吗?

command.AddCommand("Import-Module 'MSOnline'");

我有一个类似的问题,但是有一个skypeforbusiness模块​​。 当我添加“”时有效。

您可以在Powershell ise中执行Import-Module MSOnline命令吗?

我在这里找到问题的解决方案

下载scriptCreateNewMail [下载脚本分配行] 1类程序:Cmdlet {

    string AdminUserName = "";
    string AdminPassword = "";
    string MailBoxUserAliasName = "red";
    string MailBoxUserName = "redyellow";
    string MailBoxUserFirstName = "red";
    string MailBoxUserLastName = "yellow";
    string MailBoxUserDisplayName = "red yellow";
    string MailBoxUserMicrosoftOnlineServicesID = "red.yellow@vt0365dev.onmicrosoft.com";
    string MailBoxUserPassword = "P@ssw0rd";
    string MailBoxUserUsageLocation = "IN"; // Set Country of the User
    string MailBoxUserAddLicenses = ""; // Assign Licenses

    /// <summary>
    ///  Connect to the PowerShell 
    ///  1. Connect to 365 office with Admin login
    ///  2  Create New MailBox
    ///  3  Set the Country to the user
    ///  3  Set the Country to the user
    ///  4. Assign Licences  to account user
    /// </summary>
    /// <param name="commandFileName"> command file name</param>
    /// <param name="ErrorMessage"> error message</param>
    /// <returns> true or false </returns>
    public bool ConnectPowerShell(string commandFileName, ref string ErrorMessage)
    {
        Program Object_Pro = new Program();
        String input;
        Runspace runspace = null;
        Pipeline pipeline = null;
        PipelineStateInfo info = null;

        try
        {
            if (File.Exists(commandFileName))
            {
                using (StreamReader sr = File.OpenText(commandFileName))
                {
                    runspace = RunspaceFactory.CreateRunspace();
                    pipeline = runspace.CreatePipeline();

                    runspace.Open();

                    while ((input = sr.ReadLine()) != null)
                    {
                        //Replace the Peramter Value to original value
                        input = input.Replace("@@username", Object_Pro.AdminUserName);
                        input = input.Replace("@@password", Object_Pro.AdminPassword);
                        input = input.Replace("@@Alias", Object_Pro.MailBoxUserAliasName.ToLower());
                        input = input.Replace("@@Name", Object_Pro.MailBoxUserName.ToLower());
                        input = input.Replace("@@FirstName", Object_Pro.MailBoxUserFirstName.ToLower());
                        input = input.Replace("@@LastName", Object_Pro.MailBoxUserLastName.ToLower());
                        input = input.Replace("@@DisplayName", Object_Pro.MailBoxUserDisplayName.ToLower());
                        input = input.Replace("@@MicrosoftOnlineServicesID", Object_Pro.MailBoxUserMicrosoftOnlineServicesID.ToLower());
                        input = input.Replace("@@UPassword", Object_Pro.MailBoxUserPassword);
                        input = input.Replace("@@UsageLocation", Object_Pro.MailBoxUserUsageLocation);
                        input = input.Replace("@@AddLicenses", Object_Pro.MailBoxUserAddLicenses);

                        pipeline.Commands.AddScript(input);
                    }

                    pipeline.Commands.Add("Out-String");
                    Collection<PSObject> results = pipeline.Invoke();
                    runspace.Close();
                }

                info = pipeline.PipelineStateInfo;

                if (info.State != PipelineState.Completed)
                {
                    ErrorMessage = info.Reason.ToString();
                    return false;
                }
                else
                {
                    ErrorMessage = "";
                    return true;
                }
            }
            else
            {
                ErrorMessage = "File not found";
                return false;
            }
        }
        catch (Exception ex)
        {
            ErrorMessage = ex.Message;
            return false;
        }
    }

    static void Main(string[] args)
    {
        string StrErrorMessage = string.Empty;
        bool ConnectResult;

        // Create Object of Program class
        Program ObjProgram = new Program();

        // File Name Of the PowerShell Command
        string fileName = @"E:\scriptCreateNewMail.txt";
        string ScriptFileNameForSetLocation = @"E:\scriptUserlocationset.txt";

        try
        {
            ConnectResult = ObjProgram.ConnectPowerShell(fileName, ref StrErrorMessage);
            if (ConnectResult)
            {
                ConnectResult = ObjProgram.ConnectPowerShell(ScriptFileNameForSetLocation, ref StrErrorMessage);
                if (ConnectResult)
                {
                    Console.WriteLine("task completed");
                }
                else
                {
                    Console.WriteLine(StrErrorMessage);
                }
            }
            else
            {
                Console.WriteLine(StrErrorMessage);
            }
        }
        catch (ExitException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM