Shell 从Visual Basic/C#/.NET应用程序运行Exchange命令行管理cmdlet
目标:使用Visual Basic或C#或.NET提供与Exchange命令行管理程序交互的web服务,向其发送命令以运行cmdlet,并以XML形式返回结果。(请注意,我们可以使用任何语言来编写服务,但由于它是一个Windows框,并且我们有Visual Studio 2008,似乎最简单的解决方案就是使用它创建一个VB/.NET web服务。实际上,这样做非常容易,只需点击即可。) 问题:如何从web服务运行Exchange命令行管理程序cmdlet,例如,获取DistributionGroupMember“Live Presidents”Shell 从Visual Basic/C#/.NET应用程序运行Exchange命令行管理cmdlet,shell,exchange-server,cmdlets,Shell,Exchange Server,Cmdlets,目标:使用Visual Basic或C#或.NET提供与Exchange命令行管理程序交互的web服务,向其发送命令以运行cmdlet,并以XML形式返回结果。(请注意,我们可以使用任何语言来编写服务,但由于它是一个Windows框,并且我们有Visual Studio 2008,似乎最简单的解决方案就是使用它创建一个VB/.NET web服务。实际上,这样做非常容易,只需点击即可。) 问题:如何从web服务运行Exchange命令行管理程序cmdlet,例如,获取DistributionGro
似乎我们应该能够创建一个运行cmdlet的PowerShell脚本,并且能够从命令行调用它,因此只需从程序内部调用它。这听起来对吗?如果是这样的话,我该怎么做?谢谢答案可能与语言无关,但VisualBasic可能是最好的,因为这是我加载测试web服务的地方。嗯,没有得到答案,但有点想通了。我在运行64位PowerShell时遇到问题,但最终升级到Exchange 2010并使用C#,然后就不再有问题了
简单的回答是,在Visual Studio中创建一个新的PowerShell应用程序,然后添加对System.Management.Automation dll的引用。这允许您为Powershell设置名称空间并对其进行调用。您可以使用可用的管道类创建管道,以便通过管道将命令传回。然后输入命令,必要时添加参数。运行该应用程序,它将返回您在PowerShell中调用的cmdlet的结果,您可以从此处开始 从MSDN改编的实际代码可能很棘手,因为您必须获得正确的权限,并在macine上与所有Exchange插件一起运行:
using Microsoft.Win32;
using System.Collections.ObjectModel;
using System.IO;
using System.Management.Automation.Runspaces;
using System.Reflection;
public static Runspace GetExchangeRunspace()
{
return GetExchangeRunspace("");
}
public static Runspace GetExchangeRunspace(string snapIn)
{
string consoleFilePath = (ScriptEngine.GetExchangeAssemblyPath()
+ "bin\\exshell.psc1").Replace("Exchange Server", "EXCHAN~1");
Response.Write("<br/>" + consoleFilePath);
PSConsoleLoadException warnings = null;
RunspaceConfiguration runspaceConfiguration
= RunspaceConfiguration.Create(consoleFilePath, out warnings);
if ((snapIn + "").Trim().Length > 0)
{
PSSnapInException warning = null;
Response.Write("<br/>Start AddPSSnapIn..." + snapIn);
Response.Write("<br/>"
+ runspaceConfiguration.AddPSSnapIn(snapIn, out warning));
Response.Write("<br/>" + warning);
}
return RunspaceFactory.CreateRunspace(runspaceConfiguration);
}
private static string GetExchangeAssemblyPath()
{
string path = "";
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(
"SOFTWARE\\Microsoft\\ExchangeServer\\v14\\Setup"); // or your version
if (key != null)
{
path = Path.GetFullPath(string.Concat(key.GetValue("MsiInstallPath")));
Response.Write(path);
}
}
catch (Exception ex) { }
return path;
}
使用Microsoft.Win32;
使用System.Collections.ObjectModel;
使用System.IO;
使用System.Management.Automation.Runspaces;
运用系统反思;
公共静态运行空间GetExchangeRunspace()
{
返回GetExchangeRunspace(“”);
}
公共静态运行空间GetExchangeRunspace(字符串管理单元)
{
字符串consoleFilePath=(ScriptEngine.GetExchangeAssemblyPath()
+“bin\\exshell.psc1”)。替换(“Exchange服务器”、“EXCHAN~1”);
响应。写入(“
”+consoleFilePath);
PSConsoleLoadeException warnings=null;
运行空间配置运行空间配置
=RunspaceConfiguration.Create(控制台路径,输出警告);
如果((管理单元+“”).Trim()长度>0)
{
PSSnapInException警告=null;
响应。写入(“
开始添加PSSNAPIN…”+管理单元);
响应。写入(“
”
+AddPSSnapIn(管理单元,输出警告));
响应。写入(“
”+警告);
}
返回RunspaceFactory.CreateRunspace(runspaceConfiguration);
}
私有静态字符串GetExchangeAssemblyPath()
{
字符串路径=”;
尝试
{
注册表项key=Registry.LocalMachine.OpenSubKey(
“软件\\Microsoft\\ExchangeServer\\v14\\Setup”);//或您的版本
if(key!=null)
{
path=path.GetFullPath(string.Concat(key.GetValue(“msinstallpath”));
Response.Write(路径);
}
}
捕获(例外情况除外){}
返回路径;
}
如何显示Exchange命令行管理程序cmdlet?似乎您需要以某种方式添加对它们的引用,否则我会得到一个错误,即它们不存在。@Andrey您找到如何显示EMS cmdlet了吗?