我有一个用户DOMAINUser.Name
,根据 200 多个 Windows 域组中的whoami /GROUPS
。
当我尝试使用 WinAPI 函数确定该用户的所有组时::NetUserGetLocalGroups() 我只得到该用户的 27 个组:
#include <windows.h>
#include <lm.h>
#include <string>
int main()
{
//query the domain server for the groups of the user
LPGROUP_USERS_INFO_0 pBuf = NULL;
DWORD dwLevel = 0;
DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
DWORD dwEntriesRead = 0;
DWORD dwTotalEntries = 0;
NET_API_STATUS nStatus = MAX_NERR;
std::wstring serverName(L"\\MyDomainNameDns");
std::wstring userName(L"DOMAIN\user.name");
nStatus = ::NetUserGetLocalGroups(serverName.c_str(),
userName.c_str(),
dwLevel,
LG_INCLUDE_INDIRECT,
reinterpret_cast<PBYTE*>(&pBuf),
dwPrefMaxLen,
&dwEntriesRead,
&dwTotalEntries);
}
dwTotalEntries
是 27,nStatus
是 0,所以并不是说我只获取所有组的一部分。我也尝试使用::NetUserGetGroups()
,但也没有成功。
注意:使用 .NET 功能确实System.Security.Principal.WindowsIdentity.GetCurrent().Groups
确实为我提供了所有组。
NetUserGetLocalGroups 不返回 get all 组作为whoami
或.NET / WindowsIdentity
的原因可能是什么?返回/未返回的组之间可能有什么区别?
经过相当多的挖掘,我在Windows用户组讨论中发现了以下陈述:
实际上,NetUserGetLocalGroups/NetUserGetGroups不要处理 Windows 2000 中的嵌套组或通用组 原生域。 从令牌枚举 SID 是 唯一可靠的方法。
因此,换句话说,如果要直接组成员身份,请使用::NetUserGetLocalGroups
/NetUserGetGroups
。如果你想知道组的所有权,以便找出用户是否有权做某事,请使用令牌/SID方式(例如使用::OpenProcessToken
、::GetTokenInformation
和::LookupAccountSid
)。
例
用户位于(域本地)组中Employee
。所有员工都可以进入建筑物的钥匙卡,因此Employee
组是HasBuildingAccess
(域本地)组的成员。
如果想知道用户是否(直接)在Employee
组中,请使用::NetUserGetLocalGroups
。它包含Employee
组,但不包含HasBuildingAccess
组。
但是,如果想要了解用户是否有权访问建筑物,请从令牌枚举 SID。它将包含HasBuildingAccess
组。