首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetUserGetLocalGroups()返回内存位置而不是LPWSTR字符串

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

Stack Overflow用户
提问于 2018-02-15 15:16:14
回答 1查看 122关注 0票数 0

这是我关于Stackoverflow的第一个问题,所以请原谅我。

使用我的C++ MFC应用程序,我将使用以下代码获取当前登录的Windows的本地组:

代码语言:javascript
复制
#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中为更容易地打印控制台定义了sysout

代码语言:javascript
复制
#define sysout( s )                         \
{                                           \
   std::ostringstream os_;                  \
   os_ << s;                                \
   OutputDebugString( os_.str().c_str() );  \
}

运行test()时得到的输出如下:

代码语言:javascript
复制
User name is D*****.
Local groups :
007A1E02
007A1DD6
007A1DCA
Entries Local: 3
Global groups: 
Entries Global: 0

附加信息:

我正在使用多字节字符集.

我知道:

  • 007A1E02
  • 007A1DD6
  • 007A1DCA

..。看上去有点像记忆地址。我尝试了一切,将位置重新解释为可读的数据类型,但没有成功。

在使用GetUserName之前,我使用了GetUserNameW,它还返回了一个内存地址,而不是明文。也许有联系?

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-15 15:26:46

文档说:

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

您需要使用UNICODE方法(通常在Windows的末尾用大写W标记),或者需要对其进行转换

代码语言:javascript
复制
for (int i = 0; i<entries; i++)
{
    OutputDebugStringW(groups[i].lgrui0_name);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48810503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档