【问题标题】:Permissions required to retrieve local group members with ADSI使用 ADSI 检索本地组成员所需的权限
【发布时间】:2020-06-15 17:06:45
【问题描述】:

使用 ADSI,我可以通过以下方式查询给定计算机上本地管理员组的成员(例如在 PowerShell 中):

([ADSI]"WinNT://computer-name/Administrators,Group").Invoke("members")

要做到这一点,据我所知,运行 PowerShell 脚本的用户需要在目标机器上具有管理员权限——也就是说,用户需要直接在 computer-name 的本地管理员组中间接访问(例如. 通过成为“域管理员”的成员)。

这让我感到惊讶,因为可以登录 computer-name 的非管理员帐户(例如,属于“域用户”的用户)可以打开本地用户和组应用程序,并查看本地管理员组。手动执行时不需要特定权限,但 ADSI 似乎需要它。

所以我的问题是:

  • 使用 ADSI 是否需要管理员权限才能访问此信息,或者我做错了什么?
  • 是否有不同的方法来以编程方式获取此信息,它需要比管理员帐户更少的权限? (如果有 PowerShell 中没有的解决方案也没关系,我的目标是 C#/.NET Core)

请注意,我想在其他工作站上远程运行它 - 而不仅仅是在本地工作站上。

【问题讨论】:

    标签: c# windows .net-core adsi


    【解决方案1】:

    ADSI 建立在 WMI 之上。默认情况下,只允许本地管理员组进行远程 WMI 调用和读取计算机本地目录数据。

    您可以通过进入Computer Management (local) -> Services and Applications -> WMI Control 更改操作系统的权限。右键单击WMI Control 并选择Properties

    我只尝试过允许所有读取,您可以在root 文件夹中设置。我做了一些研究,您也许可以将其限制为仅 LDAP。在 Security 选项卡上向下钻取到 Root -> directory -> LDAP。您需要调整LDAP 条目(或者更多?)的权限。密钥权限为Remote Enable

    更新

    直接从 PowerShell 查询 WMI。

    通过 PowerShell 远程 WMI:https://docs.microsoft.com/en-us/windows/win32/wmisdk/connecting-to-wmi-on-a-remote-computer

    通过 WMI 列出远程组成员身份的自定义 PowerShell 方法:https://gallery.technet.microsoft.com/scriptcenter/List-local-group-members-c25dbcc4

    【讨论】:

    • @AliceHeaton 你有机会看看这个吗?
    • 是的,到目前为止我还没有设法让它工作。我有用户 U1,他在 Desktop D1 的本地“远程桌面用户”和“远程管理用户”组中。并且我已授予用户 U1 对“WMI Control > Root”的所有权限,选中“应用于此命名空间和子命名空间”。如果我现在转到桌面 D2 并使用用户 U1 登录,运行 [ADSI]"WinNT://D1/Administrators,Group" 将返回“检索 PSComputerName 时发生异常:访问被拒绝”。继续修补以防我错过了什么。
    • 很抱歉听到这个消息。也许尝试通过 Powershell 直接使用 WMI 查询?通过 PowerShell 进行远程 WMI:docs.microsoft.com/en-us/windows/win32/wmisdk/…。通过 WMI 列出组成员身份:gallery.technet.microsoft.com/scriptcenter/…
    • 是的!我可以确认直接使用 WMI 查询与 WMI 上的自定义权限一起使用(因此不需要本地管理员组的成员身份)。谢谢:)
    • 经过一些测试,我发现允许我通过 WMI 读取 Amdinistrators 组成员的最小权限是为Root > CIMV2 设置(对于进行查询的域用户)“远程启用” .不需要其他权限或组成员身份(经过身份验证的用户除外)。
    【解决方案2】:

    我认为您的 ADSI 方法应该有效,至少在本地执行时是这样。

    我使用了一个从这个 SO 答案中获取的 c# sn-p:https://stackoverflow.com/a/8192062/3374994

    为了测试它是否可以从普通用户权限运行,我使用了 Runas /user:regularuser GetLocalUsers.exe.

    我相信这表明 ADSI 方法不一定需要提升权限。

    但是,您是否打算远程运行代码?

    var path = string.Format("WinNT://{0},computer", Environment.MachineName);
    
            using (var computerEntry = new DirectoryEntry(path))
            {
                var userNames = from DirectoryEntry childEntry in computerEntry.Children
                    where childEntry.SchemaClassName == "User"
                    select childEntry.Name;
    
                foreach (var name in userNames)
                    Console.WriteLine(name);
            }
    

    【讨论】:

    • 是的,我的目的是远程运行它。我知道它适用于本地计算机上的非特权用户。当我对我的域控制器运行代码时,它也适用于非特权用户。但是要在另一个工作站上运行它(在我的测试 Windows 10 Pro 中),那么我需要一个特权用户:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2015-04-02
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多