2

次のコードは開発用 PC では問題なく動作しますが、サーバーに展開するとクラッシュします。

using System.DirectoryServices.AccountManagement;

using (var ctx = new PrincipalContext(ContextType.Domain, domainName))
using (GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupName))
{
    if (grp == null) return new string[0];

    return grp.GetMembers(true).Select(m => m.SamAccountName).ToArray();
}

クラッシュは次のとおりです。

[DirectoryServicesCOMException (0x80072020): An operations error occurred.]
   System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) +439513
   System.DirectoryServices.DirectoryEntry.Bind() +36
   System.DirectoryServices.DirectoryEntry.get_AdsObject() +31
   System.DirectoryServices.PropertyValueCollection.PopulateList() +22
   System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) +96
   System.DirectoryServices.PropertyCollection.get_Item(String propertyName) +141
   System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() +1134
   System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() +37
   System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() +124
   System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() +31
   System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) +14
   System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) +86
   System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) +29
   WebApp.WebForm1.Test() in C:\MyProject\trunk\WebApp\WebForm1.aspx.cs:30

シナリオ:

  • ドメインに参加している Windows Server 2008 x64 上の IIS7
  • ASP.NET 4 イントラネット アプリケーション
  • IIS では、統合 Windows 認証以外のすべての認証モードがオフになっています
  • ドメイン ユーザーとして実行するように構成されたアプリケーション プール

Web.config は次のとおりです。

<authentication mode="Windows" />
<authorization>
  <deny users="?"/>
</authorization>
<identity impersonate="true" >

System.Security.Principal.WindowsIdentity.GetCurrent().Name本番環境で AD ユーザー名を正しく返すので、偽装が正しく機能していることを意味すると思います。

4

2 に答える 2

0

私は非常によく似た問題を抱えていました。App Pool を NetworkService として実行することで解決しました。私もあなたと同じように Windows 認証を使用しています。

于 2013-02-21T11:46:57.490 に答える
0

私は同様の問題を抱えていました。

このエラーが発生したのは、Web サーバーにデプロイした後でした。私のマシンでは完璧に動作していました。

サーバーのIISで、偽装がウィンドウ認証でチェックされたままであることがわかりました。

そして、IIS でこの偽装を削除すると、エラーがなくなりました...

于 2013-02-08T06:36:22.760 に答える