使用 ADSI 检索本地组成员所需的权限
Permissions required to retrieve local group members with ADSI
使用 ADSI,我可以查询给定计算机上本地管理员组的成员(例如在 PowerShell 中):
([ADSI]"WinNT://computer-name/Administrators,Group").Invoke("members")
要做到这一点,据我所知,执行 PowerShell 脚本的用户 运行 需要目标机器上的管理员权限——也就是说,用户需要直接在本地管理员中间接访问computer-name
组(例如,成为“域管理员”的成员)。
这让我感到惊讶,因为可以登录 computer-name
的非管理员帐户(例如,属于“域用户”的用户,仅此而已)可以打开本地用户和组应用程序,并查看本地管理员组的成员。手动执行时不需要特定权限,但 ADSI 似乎需要它。
所以我的问题是:
- 使用 ADSI 需要管理员权限才能访问此信息是否正确,还是我做错了什么?
- 是否有不同的方法以编程方式获取此信息,需要比管理员帐户更少的权限? (如果有 PowerShell 中没有的解决方案也没关系,我的目标是 C#/.NET Core )
请注意,我想 运行 在其他工作站上远程执行此操作 - 而不仅仅是在本地工作站上。
我认为您的 ADSI 方法应该有效,至少在本地执行时是这样。
我使用了从这个 SO 答案中获取的 c# 片段:。
为了测试它是否可以 运行 从普通用户权限,我使用
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);
}
ADSI 建立在 WMI 之上。默认情况下,只允许本地管理员组进行远程 WMI 调用和读取计算机本地目录数据。
您可以进入 Computer Management (local) -> Services and Applications -> WMI Control
更改 OS 的权限。右键单击 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
使用 ADSI,我可以查询给定计算机上本地管理员组的成员(例如在 PowerShell 中):
([ADSI]"WinNT://computer-name/Administrators,Group").Invoke("members")
要做到这一点,据我所知,执行 PowerShell 脚本的用户 运行 需要目标机器上的管理员权限——也就是说,用户需要直接在本地管理员中间接访问computer-name
组(例如,成为“域管理员”的成员)。
这让我感到惊讶,因为可以登录 computer-name
的非管理员帐户(例如,属于“域用户”的用户,仅此而已)可以打开本地用户和组应用程序,并查看本地管理员组的成员。手动执行时不需要特定权限,但 ADSI 似乎需要它。
所以我的问题是:
- 使用 ADSI 需要管理员权限才能访问此信息是否正确,还是我做错了什么?
- 是否有不同的方法以编程方式获取此信息,需要比管理员帐户更少的权限? (如果有 PowerShell 中没有的解决方案也没关系,我的目标是 C#/.NET Core )
请注意,我想 运行 在其他工作站上远程执行此操作 - 而不仅仅是在本地工作站上。
我认为您的 ADSI 方法应该有效,至少在本地执行时是这样。
我使用了从这个 SO 答案中获取的 c# 片段:。
为了测试它是否可以 运行 从普通用户权限,我使用 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);
}
ADSI 建立在 WMI 之上。默认情况下,只允许本地管理员组进行远程 WMI 调用和读取计算机本地目录数据。
您可以进入 Computer Management (local) -> Services and Applications -> WMI Control
更改 OS 的权限。右键单击 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