运行 来自 C# 的 PowerShell 命令
Running PowerShell commands from C#
我有 powershell 脚本,它连接到在线交换并执行创建共享邮箱、日历、添加许可证等任务
问题是,当我 运行 来自 C# class 的那些命令时,我得到了错误。
这是我的联系人:
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");
我得到的错误如下:
Additional information: The term 'Import-Module MSOnline' 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.
我尝试了各种方法,例如复制粘贴 dll 以及将活动解决方案平台 CPU 更改为 64 位,其中 none 对我有所帮助。
可能很愚蠢,但您尝试过以下方法吗?
command.AddCommand("Import-Module 'MSOnline'");
我遇到过类似的问题,但使用的是 skypeforbusiness 模块。当我添加 '' 时工作。
你能在 powershell ise 中执行 Import-Module MSOnline 命令吗?
我找到了我的问题的解决方案here
download scriptCreateNewMail[download script assign linces]1 class 程序: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);
}
}
}
我有 powershell 脚本,它连接到在线交换并执行创建共享邮箱、日历、添加许可证等任务
问题是,当我 运行 来自 C# class 的那些命令时,我得到了错误。
这是我的联系人:
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");
我得到的错误如下:
Additional information: The term 'Import-Module MSOnline' 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.
我尝试了各种方法,例如复制粘贴 dll 以及将活动解决方案平台 CPU 更改为 64 位,其中 none 对我有所帮助。
可能很愚蠢,但您尝试过以下方法吗?
command.AddCommand("Import-Module 'MSOnline'");
我遇到过类似的问题,但使用的是 skypeforbusiness 模块。当我添加 '' 时工作。
你能在 powershell ise 中执行 Import-Module MSOnline 命令吗?
我找到了我的问题的解决方案here
download scriptCreateNewMail[download script assign linces]1 class 程序: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);
}
}
}