【问题标题】:Cannot disable or enable an Exchange mailbox running a Powershell command inside C#无法禁用或启用在 C# 中运行 Powershell 命令的 Exchange 邮箱
【发布时间】:2011-03-14 19:07:03
【问题描述】:

我有几个非常简单的 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 中执行这两个命令。

任何帮助将不胜感激?

【问题讨论】:

  • 你怎么知道它不起作用?
  • 我有权进行 Exchange 并进入 MMC 并检查该命令不起作用。例如,如果我在启用的邮箱上运行禁用命令,它仍然显示启用,反之亦然。
  • 所以你说它静默失败(即没有错误或异常)。

标签: c# .net asp.net powershell


【解决方案1】:

我终于弄清楚了导致此问题的原因,因此我将信息传递给您,以防您遇到同样的问题。我在 serverfault.com 上的this url 找到了解决方案。发生的事情是我登录并运行程序的用户被 UAC(用户访问控制)阻止。关闭它解决了这个问题。好吧,并没有真正解决,因为我不应该像这样敞开心扉,但告诉我问题出在哪里。现在我需要回去看看是否可以调整权限以允许程序运行并提供保护。

【讨论】:

    【解决方案2】:

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

    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。

    格雷格

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2018-01-28
      • 1970-01-01
      • 2018-10-12
      • 2015-06-11
      相关资源
      最近更新 更多