无法在C#中禁用或启用运行Powershell命令的Exchange邮箱

时间:2011-03-14 19:07:04

标签: c# .net asp.net powershell

我有一些非常简单的powershell命令。

disable-mailbox dadelgad -confirm:$false
enable-mailbox -identity 'dadelgad' -database 'NET5014DB10' -Alias 'dadelgad'

第一个命令是禁用交换邮箱,第二个命令启用邮箱。我以组织管理组中的用户身份登录,该组具有对Exchange的完全管理员权限,但不是域管理员。如果我直接在Powershell中运行这些命令,它们可以正常工作,但从C#调用时它们不起作用。

我创建了一个非常简单的Windows窗体应用程序,它有几个按钮从C#代码调用这些命令。以具有完全Exchange权限的用户身份运行应用程序,大多数命令都没有问题,例如get-mailbox -identity'dadelgad'。我可以在Exchange中设置标记,添加别名电子邮件并执行大多数功能,但我无法禁用或启用帐户。

我是否需要成为域管理员来执行这些功能。这似乎是一个权限问题,但用户拥有Exchange的完全权限,可以直接在Powershell中执行这两个命令。

任何帮助都会受到赞赏吗?

2 个答案:

答案 0 :(得分:1)

我终于弄明白是什么导致了这个问题所以我将信息传递给你,以防你遇到同样的问题。我在this url的serverfault.com上找到了解决方案。发生的事情是我登录的用户和运行该程序的用户被UAC(用户访问控制)阻止。关闭它解决了这个问题。好吧,没有真正解决,因为我不应该像这样大开,但告诉我问题是什么。现在我需要回过头来看看我是否可以调整权限以允许程序运行,但也提供保护。

答案 1 :(得分:1)

我使用下面的代码创建了一个邮箱,我已经更改了它以启用邮箱,它也可以用于禁用。确保找到更好的方法来保护帐户的密码,而不仅仅是硬编码。

SecureString password = new SecureString();
string username = "youruseraccount";
string str_password = "thepassword";
string exchangeserver = "yourexchangeserver";
string liveIdconnectionUri = "http://" + exchangeserver +"/Powershell?serializationLevel=Full";
foreach (char x in str_password) {
    password.AppendChar(x);
}

PSCredential credential = new PSCredential(username, password);
WSManConnectionInfo connectionInfo = new WSManConnectionInfo((new Uri(liveIdconnectionUri)), "http://schemas.microsoft.com/powershell/Microsoft.Exchange",credential);
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default;

Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo);
PowerShell powershell = PowerShell.Create();
runspace.Open();
powershell.Runspace = runspace;

PSCommand command1 = new PSCommand();
command1.AddCommand("Enable-Mailbox");
command1.AddParameter("Identity", "dadelgad");
command1.AddParameter("Database", "NET5014DB10");
//Add as many parameters as you need

powershell.Commands = command1;
powershell.Invoke();

要运行其他命令,请创建一个新的PSCommand,以相同的方式将powershell实例添加到之后上一次调用并再次调用powershell。

格雷格