这是我关于Stackoverflow的第一个问题所以请放纵我。
我使用以下代码获取当前使用我的C ++ MFC应用程序登录Windows用户的本地组:
#include <windows.h>
#include <lm.h>
#include <stdio.h>
#include <sstream>
#pragma comment(lib, "netapi32")
int test()
{
char acUserName[100];
DWORD nUserName = sizeof(acUserName);
if (GetUserName(acUserName, &nUserName))
{
sysout( "User name is " << acUserName << "." << endl);
}
//printf("Local groups: \n");
sysout("Local groups :\n");
LPBYTE buffer;
DWORD entries, total_entries;
NetUserGetLocalGroups(NULL, L"EUROPE\\D*****", 0, LG_INCLUDE_INDIRECT, &buffer, MAX_PREFERRED_LENGTH, &entries, &total_entries);
LOCALGROUP_USERS_INFO_0 *groups = (LOCALGROUP_USERS_INFO_0*)buffer;
for (int i = 0; i<entries; i++)
{
sysout(groups[i].lgrui0_name << endl);
}
sysout("Entries Local: " << entries << endl);
NetApiBufferFree(buffer);
//printf("Global groups: \n");
sysout("Global groups: \n");
NetUserGetGroups(NULL, L"EUROPE\\DEU218535", 0, &buffer, MAX_PREFERRED_LENGTH, &entries, &total_entries);
sysout("Entries Global: " << entries << endl);
GROUP_USERS_INFO_0 *ggroups = (GROUP_USERS_INFO_0*)buffer;
for (int i = 0; i<entries; i++)
{
//printf("\t%S\n", ggroups[i].grui0_name);
sysout(ggroups[i].grui0_name << endl);
}
NetApiBufferFree(buffer);
return 0;
}
注意:我在Visual Studio中定义了sysout以便更轻松地进行控制台打印
#define sysout( s ) \
{ \
std::ostringstream os_; \
os_ << s; \
OutputDebugString( os_.str().c_str() ); \
}
我运行test()
时得到的输出是:
User name is D*****.
Local groups :
007A1E02
007A1DD6
007A1DCA
Entries Local: 3
Global groups:
Entries Global: 0
其他信息:
我正在使用多字节字符集。
我知道:
007A1E02
007A1DD6
007A1DCA
......看起来像是内存地址。 我尝试了将所有内容重新解释为可读数据类型而没有任何成功。
在我使用GetUserName
之前,我使用了GetUserNameW
,并且还返回了内存地址而不是明文。也许有联系?
感谢您的帮助!
答案 0 :(得分:1)
<强> lgrui0_name 强>
指向 Unicode 字符串的指针,指定用户所属的本地组的名称
您需要使用UNICODE方法(通常在Windows上标记为大写的W),或者您需要convert它:
for (int i = 0; i<entries; i++)
{
OutputDebugStringW(groups[i].lgrui0_name);
}