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

本文关键字:启用 创建 AD | 更新日期: 2023-09-27 18:07:30

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

当我运行这个时,它是有时在邮件启用上失败,错误是"Active Directory帐户必须为用户的邮箱启用登录。"

如果重新运行相同的代码,但只是尝试邮件启用帐户,它工作得很好。同样,其他时候,它能够创建AD帐户和邮件启用。

此链接表明,当Exchange试图通过邮件启用该帐户时,AD仍在配置该帐户:

http://social.technet.microsoft.com/forums/en - us/exchangesvrdevelopment/thread/d53d91fd c479 - 40 - e4 - 9791 - 32 - cb5da24721?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();
    }
}

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

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

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

您应该做的是排队交换和您的AD创建代码与同一个DC交谈。

来自S.DS下的PrincipalContext对象。AMConnectedServer属性读取DC的FQDN。然后将该值传递给enable-mailbox cmdlet的-DomainController参数。

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

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