NetUserGetLocalGroups()返回内存位置而不是LPWSTR字符串

时间:2018-02-15 15:16:15

标签: c++ mfc

这是我关于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,并且还返回了内存地址而不是明文。也许有联系?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

documentation说:

  

<强> lgrui0_name

     

指向 Unicode 字符串的指针,指定用户所属的本地组的名称

您需要使用UNICODE方法(通常在Windows上标记为大写的W),或者您需要convert它:

for (int i = 0; i<entries; i++)
{
    OutputDebugStringW(groups[i].lgrui0_name);
}