我编写了C#代码以从Active Directory获取电子邮件。它在我的本地系统上工作正常,但托管后我没有收到电子邮件地址。以下是我已经尝试过的事情 -
NetworkService
代码:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "comppany.com" , "DC=compnay,DC=com", ContextOptions.Negotiate))
// tried above and below//(ContextType.Domain, System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName))
{
// validate the credentials
bool isValid = pc.ValidateCredentials(Uid, Pwd);
if (isValid)
{
try
{
using (UserPrincipal up = UserPrincipal.FindByIdentity(pc, Uid))
{
return up != null && !String.IsNullOrEmpty(up.EmailAddress) ? up.EmailAddress : string.Empty;
}
//return "Validate successfully.";
}
catch (Exception ex)
{
return ex.Message;
}
}
}
还试过以下 -
using (var connection = new DirectoryEntry())
{
using (var search = new DirectorySearcher(connection)
{
Filter = "(samaccountname=" + Uid + ")",
PropertiesToLoad = { "mail" },
})
{
return (string)search.FindOne().Properties["mail"][0];
}
}
在IIS7.0中托管应用程序后,他们都没有工作
请帮忙。 感谢
答案 0 :(得分:0)
这将是因为您的用户(即您)有权从Active Directory读取,但IIS用户和网络服务不会。
在using语句中放置一个try catch,你应该在异常中看到这个。
还有其他PrincipalContext构造函数,允许您指定要连接的用户的详细信息,或者您可以将IIS应用程序池更改为以具有权限的用户身份运行 - 但我会使用PrincipalContext方式。
作为一个快速测试尝试this版本的PrincipalContext构造函数 - 将您的用户名和密码放在用户名和密码参数中,看看它是否在IIS中托管时有效 - 如果这样做,那么你需要提出在via config中传递用户详细信息的一些方法。 (通常只有读取权限的服务帐户,其密码不会经常更改)