C# LDAP路径和查询本地用户目录的权限?

C# LDAP路径和查询本地用户目录的权限?,c#,asp.net,permissions,active-directory,C#,Asp.net,Permissions,Active Directory,我正在开发一个web应用程序,ASP.NET,C#。用户需要使用帐户local登录到运行应用程序的机器,在本例中,我称之为“cyclops”。我希望应用程序能够查询用户和组的本地目录,以确定用户所在的组。代码如下所示: DirectoryEntry entry = new DirectoryEntry("WinNT://cyclops/Users", "SomeServiceAccount", "SvcAcctP@$$word", AuthenticationTypes.Secure);

我正在开发一个web应用程序,ASP.NET,C#。用户需要使用帐户local登录到运行应用程序的机器,在本例中,我称之为“cyclops”。我希望应用程序能够查询用户和组的本地目录,以确定用户所在的组。代码如下所示:

DirectoryEntry entry = new DirectoryEntry("WinNT://cyclops/Users", "SomeServiceAccount",
    "SvcAcctP@$$word", AuthenticationTypes.Secure);
entry.RefreshCache();
// Etc.
我的两个问题是:

  • 这显然不是正确的方法,但我的研究 实验还没有找到正确的答案,但这并不能填补空白。 我是否使用“LDAP://cyclops/Users”、“WinNT://localhost/Users”, “WinNT://cyclops/cn=Users”
  • 如你所见,我提供 本地服务帐户的凭据。该账户需要 允许访问本地目录,但我不知道在哪里 设置这些权限。它是某个特定的文件吗?做 帐户必须是特定组的成员吗
  • 我的实验产生了许多错误:“找不到组名”,“提供程序不支持搜索…”,“服务器不工作”,“未知错误(0x80005004)”等等

    谢谢你抽出时间。。。
    -JWWinNT需要以下格式

    WinNT://<domain/server>/<object name>,<object class>
    
    在哪里

    • UserAccount是所需用户的名称
    • 点代表当前机器(您可以用cyclops或use Environment.MachineName替换它)
    • 可能需要用户凭据(“SomeServiceAccount”、“SvcAcctP@$$word”),具体取决于设置
    要获取特定组中的用户,请使用

    using (DirectoryEntry entry = new DirectoryEntry("WinNT://./Users,group")) 
    {
        foreach (object member in (IEnumerable)entry.Invoke("Members"))
        {
            using(DirectoryEntry m = new DirectoryEntry(member))
            {
                Response.Write(m.Name);
            }
        }
    }
    
    在哪里

    • Users是组的名称

    谢谢。我正在尝试第二种方法,使用路径“WinNT:///客户端用户,组”。我现在遇到的错误是“System.NotSupportedException:提供程序不支持搜索,无法搜索WinNT://./客户端用户,组”。这是在我设置过滤器“sAMAccountName=jsmith”并调用FindAll()后发生的。这是一个权限问题,还是我需要在配置中稍微翻转一下,或者…?您不能混合使用WinNT和LDAP提供程序。WinNT中没有按SamaAccountName进行搜索。如果您需要jsmith组,您应该使用第一个示例,而不是第二个示例。使用第一个示例解决了我的问题,但需要注意的是,该站点速度非常慢。但是,速度可能完全无关,因此我将称之为已解决。您可以尝试使用PrincipalContext或查询LDAP来查看它是否工作得更快。示例:
    using (DirectoryEntry entry = new DirectoryEntry("WinNT://./Users,group")) 
    {
        foreach (object member in (IEnumerable)entry.Invoke("Members"))
        {
            using(DirectoryEntry m = new DirectoryEntry(member))
            {
                Response.Write(m.Name);
            }
        }
    }