创建后过早启用AD帐户的邮件

时间:2011-09-02 23:25:49

标签: c# powershell active-directory exchange-server directoryservices

我正在使用System.DirectoryServices.AccountManagement库创建AD用户帐户,然后在使用PowerShell运行空间运行Enable-Mailbox命令后不久。

运行此操作时,有时在Mail-Enable上失败,并显示错误“必须为用户的邮箱启用Active Directory帐户。”< / p>

如果重新运行相同的代码,但只是尝试邮件启用该帐户,它可以正常工作。而且,有时它可以创建AD帐户和Mail-Enable。

此链接表明,当Exchange尝试对其进行邮件启用时,AD仍在配置帐户:

http://social.technet.microsoft.com/Forums/en-US/exchangesvrdevelopment/thread/d53d91fd-c479-40e4-9791-32cb5da24721?prof=required

这是运行空间代码:

var connectionInfo = new WSManConnectionInfo(new Uri(ConfigurationManager.AppSettings["PSExchangeURI"]), ConfigurationManager.AppSettings["PSExchangeShellURI"], new PSCredential(ConfigurationManager.AppSettings["Username"], ConfigurationManager.AppSettings["Password"].ToSecureString()));
connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Kerberos;

var command = new Command("Enable-Mailbox");
command.Parameters.Add("Identity", userPrincipal.UserPrincipalName);
command.Parameters.Add("Alias", userPrincipal.SamAccountName);
command.Parameters.Add("DisplayName", userPrincipal.DisplayName);
command.Parameters.Add("Database", ConfigurationManager.AppSettings["ExchangeDatabase"]);

using (var runspace = RunspaceFactory.CreateRunspace(connectionInfo)) {
    using (var pipeline = runspace.CreatePipeline()) {
        runspace.Open();
        pipeline.Commands.Add(command);

        var results = pipeline.Invoke();
    }
}

我还能做些什么来避免这个错误(除了引入一个线程睡眠)?

2 个答案:

答案 0 :(得分:5)

您所看到的可能是复制时间延迟,交换服务器与不同的DC通信,然后是AD用户创建代码。

您应该做的是将交换和您的AD创建代码对齐以与同一DC进行通信。

S.DS.AM 下的 PrincipalContext 对象中,从 ConnectedServer 属性中读取DC的FQDN。然后将该值传递给enable-mailbox cmdlet的 -DomainController 参数。

答案 1 :(得分:0)

所以我解决了#34;硬编码&#34;通过在运行时在我的代码中声明 $ dchostname 变量来解决DC问题。它查询域以查找合适的DC,然后我的脚本中的所有进程都使用该域。这样即使我更换了所有DC,我也不必更新我的代码。

#Domain Controller Information
$dcs = (Get-ADDomainController -Filter *)
$dc = $dcs | Where {$_.OperationMasterRoles -like "*RIDMaster*"}
$dchostname = $dc.HostName