我正在编写一个实用程序来审核WCF服务的配置。为了从客户端正确传递凭据,通过WCF服务返回SQL后端,必须在Active Directory中配置用于运行服务的域帐户,并设置“信任此用户以进行委派”(属性 - >“代表团“标签”。
使用C#,如何在Active Directory中访问此选项卡上的设置。我花了最后5个小时尝试在网上跟踪这个,似乎无法找到它。
这是我到目前为止所做的:
using (Domain domain = Domain.GetCurrentDomain())
{ Console.WriteLine(domain.Name);
// get domain "dev" from MSSQLSERVER service account
DirectoryEntry ouDn = new DirectoryEntry("LDAP://CN=Users,dc=dev,dc=mydomain,dc=lcl");
DirectorySearcher search = new DirectorySearcher(ouDn);
// get sAMAccountName "dev.services" from MSSQLSERVER service account
search.Filter = "(sAMAccountName=dev.services)";
search.PropertiesToLoad.Add("displayName");
search.PropertiesToLoad.Add("userAccountControl");
SearchResult result = search.FindOne();
if (result != null)
{
Console.WriteLine(result.Properties["displayName"][0]);
DirectoryEntry entry = result.GetDirectoryEntry();
int userAccountControlFlags = (int)entry.Properties["userAccountControl"].Value;
if ((userAccountControlFlags & (int)UserAccountControl.TRUSTED_FOR_DELEGATION) == (int)UserAccountControl.TRUSTED_FOR_DELEGATION)
Console.WriteLine("TRUSTED_FOR_DELEGATION");
else if ((userAccountControlFlags & (int)UserAccountControl.TRUSTED_TO_AUTH_FOR_DELEGATION) == (int)UserAccountControl.TRUSTED_TO_AUTH_FOR_DELEGATION)
Console.WriteLine("TRUSTED_TO_AUTH_FOR_DELEGATION");
else if ((userAccountControlFlags & (int)UserAccountControl.NOT_DELEGATED) == (int)UserAccountControl.NOT_DELEGATED)
Console.WriteLine("NOT_DELEGATED");
foreach (PropertyValueCollection pvc in entry.Properties)
{
Console.WriteLine(pvc.PropertyName);
for (int i = 0; i < pvc.Count; i++)
{
Console.WriteLine("\t{0}", pvc[i]);
}
}
}
}
“userAccountControl”似乎不是正确的属性。我认为它与“帐户”标签上的“帐户选项”部分相关联,这不是我们想要的,但这是我到目前为止最接近的。
所有这一切的理由是:我们无权在质量保证或生产中设置服务,因此连同我们的书面说明(众所周知,仅部分遵循)我正在创建一个审核设置的工具(WCF和SQL)确定设置是否正确。这将允许部署服务的人员运行此实用程序并验证所有设置是否正确 - 节省了数小时的麻烦并减少了部署期间的停机时间。
答案 0 :(得分:2)
可能太晚了,但是......发现它,所以我想我会分享它。
有问题的属性称为“msDS-AllowedToDelegateTo”,它仅出现在具有已配置SPN值的帐户中,但它为您提供了一个完整的列表,列出了您的对象受委托的所有服务。
希望这可以节省其他人必须阅读kerberos规范几个小时。
答案 1 :(得分:1)
好的,我错了。当我第一次运行它时,userAccountControl没有设置TRUSTED_FOR_DELEGATION。我不知道这是否是一个缓存问题。我添加了:
entry.RefreshCache(new string [] {“userAccountControl”});
确保它不缓存该值。我不知道这是否有效,但为了以防万一我添加了它。