C#学习教程:在C#中连接到MicrosoftExchangePowerShell我的目标是创建我自己的MicrosoftPowerShellISE版本。所以我需要一种方法来从远程计算机上的应用程序执行PowerShell脚本。我已经创建了几种方法并在我的应用程序的本地机器上测试了它们。如果我不使用WSManConnectionInfo并使用(RunspaceremoteRunspace=RunspaceFactory.CreateRunspace())我可以在本地执行脚本,就好像它是真正的powershell(小脚本,使用变量,使用ft,fl输出数据,做很多我通常使用powershell做的其他事情。当我添加WSManConnectionInfo并将其指向我的Exchange服务器而不是使用本地连接时,问题就来了。它似乎能够做一些基本的事情,比如“get-mailbox”,但是一旦我尝试管道的东西,使用一些脚本功能,如$variables,它打破说它不受支持。此外,我必须禁用powershell.AddCommand("out-string");当不在本地使用它时。System.Management.Automation.dllAn类型为“System.Management.Automation.RemoteException”的未处理异常发生在。附加信息:术语“Out-String”未被识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查拼写名称,或者如果包含路径,请验证路径是否正确,然后重试。如果我不强制远程连接而只是在本地执行,我不会得到同样的错误。似乎SchemaUri只是对执行基本命令非常严格。我看到其他人的示例使用非常直接的信息:powershell.AddCommand("Get-Users");powershell.AddParameter("ResultSize",count);但是使用这种方法我必须定义许多可能的选项,我不想通过定义参数和东西。我只想加载“脚本”并像在PowerShell窗口中一样执行它。这是我现在正在使用的示例。publicstaticWSManConnectionInfoPowerShellConnectionInformation(stringserverUrl,PSCredentialpsCredentials){varconnectionInfo=newWSManConnectionInfo(newUri(serverUrl),"http://schemas.microsoft.com/powershell/Microsoft.Exchange",psCredentials);//varconnectionInfo=newWSManConnectionInfo(newUri(serverUrl),"http://schemas.microsoft.com/powershell",psCredentials);connectionInfo.AuthenticationMechanism=AuthenticationMechanism.Basic;connectionInfo.SkipCACheck=true;connectionInfo.SkipCNCheck=true;connectionInfo.SkipRevocationCheck=true;connectionInfo.MaximumConnectionRedirectionCount=5;connectionInfo.OperationTimeout=150000;返回连接信息;}publicstaticPSCredentialSecurePassword(stringlogin,stringpassword){SecureStringssLoginPassword=newSecureString();foreach(密码中的字符x){ssLoginPassword.AppendChar(x);}返回新的PSCredential(登录名,ssLoginPassword);}公共静态字符串RunScriptPs(WSManConnectionInfoconnectionInfo,stringscriptText){StringBuilderstringBuilder=newStringBuilder();//使用连接信息创建远程运行空间。//using(RunspaceremoteRunspace=RunspaceFactory.CreateRunspace())using(RunspaceremoteRunspace=RunspaceFactory.CreateRunspace(connectionInfo)){//通过调用Open()方法打开运行空间来建立连接。//之前设置的OpenTimeout值将在建立//连接时应用。建立远程连接涉及发送和//接收一些数据,因此OperationTimeout也会在此过程中发挥作用。remoteRunspace.Open();//创建一个PowerShell对象以在远程运行空间中运行命令。使用(PowerShellpowershell=PowerShell.Create()){powershell.Runspace=remoteRunspace;powershell.AddScript(scriptText);//powershell.AddCommand("输出字符串");powershell.Commands.Commands[0].MergeMyResults(管道结果tTypes.Error,PipelineResultTypes.Output);采集结果=powershell.Invoke();foreach(PSObjectresultinresults){stringBuilder.AppendLine(result.ToString());}}//关闭连接。调用Close()方法关闭远程//运行空间。Dispose()方法(通过使用原语调用)将调用//Close()方法(如果尚未调用)。远程运行空间。关闭();}//将脚本结果转换为单个字符串returnstringBuilder.ToString();关于为什么会发生这种情况的任何建议,以及如何让它以相同的方式运行的解决方法?我看过很多这样的博客,但是定义每个简单的命令对我来说没有意义我也看到了创建本地连接然后在那里执行远程连接的选项,但这必须是最后的手段,因为它依赖于许多其他因素。检查https://blogs.msdn.microsoft.com/akashb/2010/03/25/how-to-migrating-exchange-2007-powershell-managed-code-to-work-with-exchange-2010/:Exchange2010通过PowerShell提供的管理体验已从本地更改为远程。[...]只有交换cmdlet可以在此远程场景中工作,您将无法运行大多数PowerShellcmdlet。[…]是的,这意味着您将无法在远程运行空间中运行Where-Object和.PS1脚本等cmdlet。这是一个限制吗?我不这么认为。我们可以通过创建一个新的Session并导入它来轻松解决它。所以你需要做这样的事情:PSCredentialcreds=newPSCredential(userName,securePassword);System.Uriuri=newUri("http://Exchange-Server/powershell?serializationLevel=Full");运行空间runspace=RunspaceFactory.CreateRunspace();PowerShellpowershell=PowerShell.Create();PSCommand命令=newPSCommand();command.AddCommand("New-PSSession");command.AddParameter("ConfigurationName","Microsoft.Exchange");command.AddParameter("ConnectionUri",uri);command.AddParameter("凭证",creds);command.AddParameter("身份验证","默认");powershell.Commands=命令;运行空间.Open();powershell.Runspace=运行空间;采集结果=powershell.Invoke();powershell=PowerShell.Create();命令=新的PSCommand();command.AddCommand("设置变量");command.AddParameter("名称","ra");command.AddParameter("值",结果[0]);powershell.Commands=命令;powershell.Runspace=运行空间;powershell.Invoke();powershell=PowerShell.Create();C命令=新的PSCommand();command.AddScript("Import-PSSession-Session$ra");powershell.Commands=命令;powershell.Runspace=运行空间;powershell.Invoke();#现在您可以像使用本地PS一样使用远程PS从ExchangeServer2010开始,您需要使用远程PowerShell会话而不是直接添加ExchangePowerShell管理单元(由于在Exchange2010中使用RBAC而不是ACL)因此,您需要创建一个新的PowerShell会话(使用New-PSSession),然后导入它(使用Import-PSSession)。您可以使用这种代码来执行远程程序PowerShell命令:voidExecutePowerShellUsingRemotimg(){RunspaceConfigurationrunspaceConfig=RunspaceConfiguration.Create();PSSnapInExceptionsnapInException=null;运行空间runspace=RunspaceFactory.CreateRunspace(runspaceConfig);运行空间.Open();流水线pipeline=runspace.CreatePipeline();stringserverFqdn="你服务器的FQDN";pipeline.Commands.AddScript(string.Format("$Session=New-PSSession-ConfigurationNameMicrosoft.Exchange-ConnectionUrihttp://{0}/P??owerShell/-AuthenticationKerberos",serverFqdn));pipeline.Commands.AddScript("Import-PSSession$Session");pipeline.Commands.AddScript("你的PowerShell脚本文本");pipeline.Commands.Add("Out-String");收集结果=pipeline.Invoke();运行空间.Close();StringBuildersb=newStringBuilder();if(pipeline.Error!=null&&pipeline.Error.Count>0){//读取错误成功=false;集合错误=pipeline.Error.ReadToEnd();foreach(对象错误或错误)sb.Append(error.ToString());}else{//读取输出foreach(PSObjectobjinresults)sb.Append(obj.ToString());}runspace.Dispose();pipeline.Dispose();看起来你遇到了双跃点身份验证问题,我在试图搞砸时遇到了同样的问题,我最终在本地安装了ExchangePowershell插件并使用它们远程连接到Exchange服务器。一个粗略的例子:以上就是C#学习教程:在C#中连接到MicrosoftExchangePowerShell分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注—RunspaceConfigurationrunspaceConfiguration=RunspaceConfiguration。创造();PSSnapInInfo信息=runspaceConfiguration.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin",outsnapInException);运行空间runspace=RunspaceFactory.CreateRunspace(runspaceConfiguration);运行空间.Open();使用(PowerShellpowershell=PowerShell.Create()){powershell.Runspace=runspace;stringscript=string.Format(@"Get-Mailbox-Server{0}-Identity{1}",serverName,identity);powershell.AddScript(脚本);powershell.调用();//Dosomethingwiththeoutput}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
