1

マシン上のローカル グループからグループ メンバーシップを検索するコードがあります。メンバーごとに、ユーザーに関する情報を読み込もうとします (たとえば、グループを見つけて、各メンバーの名前を取得します)。

コード:

using (DirectoryEntry machine = new DirectoryEntry("WinNT://" + Environment.MachineName + ", Computer"))
{
    using (DirectoryEntry group = machine.Children.Find(groupName, "group"))
    {
        object members = group.Invoke("members", null);

        foreach (object groupMember in (IEnumerable) members)
        {
            using (DirectoryEntry member = new DirectoryEntry(groupMember))
            {
                member.RefreshCache();
                string name = member.Name;
                // <code snipped>
            }
        }
    }
}

ほとんどの場合、コードは問題なく動作しますが、一部のグループ メンバーでは、メソッドがスローされたFileNotFoundExceptionときにがスローされます。RefreshCache()

System.IO.FileNotFoundException: 
    The filename, directory name, or volume label syntax is incorrect.
    (Exception from HRESULT: 0x8007007B)
at System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo()
at System.DirectoryServices.DirectoryEntry.RefreshCache()
at GroupLookup.GetLocalGroupMembership(String groupName)

何が原因ですかFileNotFoundException(そして、どのファイルを探していますか)?

4

2 に答える 2

2

ファイルが見つからないエラーは、Win32 API で "リソースが見つかりません" エラーとして一般的に使用されます。そのため、レジストリ キーが見つからない、またはこの場合は ADSI ノードがないなどの場合に返されます。

私は間違いなく ADSI の専門家ではありませんが、MSDN によるとDirectoryEntry、コンストラクターへの最初の呼び出しで無効なパス スタイルが使用されているようです。マシン名の前にドメイン名が必要だと思います。

アップデート:

別の MSDN ページでこれに気付きました:「GetInfo は、WinNT スコープの既知のセキュリティ プリンシパルであるメンバーを含むグループには使用できません。」

スタック トレースを考えると、これが問題を引き起こしている可能性があります。

于 2010-07-22T11:02:53.547 に答える
0

グループのセットアップに関係していると思わFileNotFoundExceptionれますが、.

ユーザーの名前と SID のみが必要であり、これらは既に に存在していたためDirectoryEntry、メソッドを呼び出さないようにしてこの問題を解決しましたRefreshCache。これにより、例外なくコードを実行できます。

于 2010-08-18T22:57:48.797 に答える