我正在使用System.DirectoryServices.AccountManagement
库创建AD用户帐户,然后在使用PowerShell运行空间运行Enable-Mailbox
命令后不久。
运行此操作时,有时在Mail-Enable上失败,并显示错误“必须为用户的邮箱启用Active Directory帐户。”< / p>
如果重新运行相同的代码,但只是尝试邮件启用该帐户,它可以正常工作。而且,有时它可以创建AD帐户和Mail-Enable。
此链接表明,当Exchange尝试对其进行邮件启用时,AD仍在配置帐户:
这是运行空间代码:
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();
}
}
我还能做些什么来避免这个错误(除了引入一个线程睡眠)?
答案 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