0

System.DirectoryServices.AccountManagement用来获取用户所属的所有组,下面是用于获取用户所有组的代码。

public void GetUserGroups(string userName)
{    
  UserPrincipal user = null;
  using (HostingEnvironment.Impersonate())
  {
    // establish domain context
    PrincipalContext domain = new PrincipalContext(ContextType.Domain);
    // find your user
    user = UserPrincipal.FindByIdentity(domain, userName);
  }
  // if found - grab its groups
  if (user != null)
  {
    PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
  }
}

这在我的开发服务器中效果很好,但是当代码部署在 IIS、DMZ 中的 UAT 服务器中时,此代码失败并显示以下堆栈跟踪:

Message:    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.PropertyValueCollection.PopulateList()
   at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
   at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
   at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue)
   at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue)
   at LandingPage.GetUserGroups(String userName)
   at LandingPage.Page_Load(Object sender, EventArgs e)

我的问题与System.DirectoryServices.AccountManagement 在服务器上不起作用并使用相同的分辨率非常相似, 但没有任何帮助。

请指教。

4

1 回答 1

1

由于“使用(HostingEnvironment.Impersonate())”使其充当应用程序池的身份,所以问题是:每个应用程序池上的身份是什么?“网络服务”?“应用程序池身份”?自定义帐户?

要在 IIS 7 中查看,首先查看站点的基本设置,以查看其应用程序池的名称。然后单击左侧框架中的“应用程序池”,并查看该应用程序池的标识列。

如果 UAT 服务器上站点的应用程序池具有自定义帐户,并且它是域用户,则首先设置开发服务器的站点,以使用相同的域用户作为其应用程序池的身份。

要在 IIS 7 中更改它,右键单击应用程序池,选择“高级设置”,查找身份,单击“自定义帐户”单选按钮,单击“设置”...

(附带主题:如果您的站点完全使用 SQL Server,则使用“NetworkService”作为应用程序池标识的缺点。虽然您在上面尝试在 Windows 中执行的操作可以是一致的 - 为“NT AUTHORITY”设置 Windows 权限\NETWORK SERVICE" -- SQL Server 的权限将涉及至少 2 次登录设置,因为远程 SQL Server 访问权限将在用户 "DomainName\AspNetServer$" 下。
有关详细信息,请参阅:http: //msdn.microsoft.com /en-us/library/ff647402.aspx 例如,对于在域“DOMAINION”中的开发服务器“OURMIGHTYDEV”和 UAT 服务器“UATRULES”(您可以说我很喜欢编这些名称;),可以有效地具有不同的身份,例如登录“DOMAINION\ OURMIGHTDEV$”,然后登录“DOMAINION\UATRULES$”——你必须为 2 次登录设置匹配权限等。)

于 2013-10-24T20:42:32.323 回答