为什么 WinAPI 函数 ::NetUserGetLocalGroups() 不返回所有组?



我有一个用户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组。

相关内容

  • 没有找到相关文章

最新更新