You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取本地组成员:C++是否有替代PowerShell Get-LocalGroupMember的内置API?

当然有!在Windows平台上,你可以用Windows原生API实现和Get-LocalGroupMember -Group "Administrators"完全相同的功能,最直接的工具就是NetLocalGroupGetMembers函数——它属于Windows网络管理API系列,专门用来查询本地组的成员列表。

核心API介绍

NetLocalGroupGetMembers是Windows SDK提供的官方函数,定义在lmaccess.h头文件中,编译时需要链接netapi32.lib库。它支持分页获取组内成员,能返回用户、域用户、嵌套组等多种类型的成员信息,完全覆盖PowerShell命令的能力。

完整C++实现示例

下面是一个可直接编译运行的代码示例,演示如何获取本地Administrators组的所有成员:

#include <windows.h>
#include <lmaccess.h>
#include <iostream>
#include <string>

#pragma comment(lib, "netapi32.lib")

void ListLocalAdminMembers() {
    LOCALGROUP_MEMBERS_INFO_3* memberInfo = nullptr;
    DWORD entriesRead = 0;
    DWORD totalEntries = 0;
    DWORD resumeHandle = 0;
    NET_API_STATUS apiStatus;

    // 循环处理分页数据(成员过多时API会分批返回)
    do {
        apiStatus = NetLocalGroupGetMembers(
            nullptr,                  // 传入nullptr表示当前本地计算机
            L"Administrators",        // 目标组名称
            3,                        // 使用LEVEL 3,返回账户名+域名/计算机名
            reinterpret_cast<LPBYTE*>(&memberInfo),
            MAX_PREFERRED_LENGTH,     // 让系统自动分配足够内存
            &entriesRead,
            &totalEntries,
            &resumeHandle
        );

        if (apiStatus == NERR_Success || apiStatus == ERROR_MORE_DATA) {
            for (DWORD i = 0; i < entriesRead; ++i) {
                std::wcout << L"账户名: " << memberInfo[i].lgrmi3_name << std::endl;
                if (memberInfo[i].lgrmi3_domainname) {
                    std::wcout << L"所属域/本地机: " << memberInfo[i].lgrmi3_domainname << std::endl;
                }
                std::wcout << L"-------------------------" << std::endl;
            }

            // 必须释放API分配的内存,避免泄漏
            NetApiBufferFree(memberInfo);
            memberInfo = nullptr;
        } else {
            std::wcerr << L"查询失败,错误码: " << apiStatus << std::endl;
            break;
        }
    } while (apiStatus == ERROR_MORE_DATA);
}

int main() {
    std::wcout << L"本地管理员组成员列表:" << std::endl;
    std::wcout << L"-------------------------" << std::endl;
    ListLocalAdminMembers();
    return 0;
}
关键注意事项
  • 权限要求:该函数需要管理员权限才能完整查询Administrators组的成员,普通用户调用可能会返回部分信息或直接失败。
  • 返回级别选择:示例中使用了LEVEL 3(对应LOCALGROUP_MEMBERS_INFO_3结构),能返回最常用的账户名和域名信息。你也可以根据需求选择其他级别,比如LEVEL 0只返回成员SID,LEVEL 1返回SID+账户名。
  • 兼容性:这个API从Windows 2000开始就存在,完美支持Win7/8/10/11以及所有Windows Server版本。
  • 内存管理:调用NetLocalGroupGetMembers后必须用NetApiBufferFree释放内存,这是Windows网络API的标准内存管理方式。
替代扩展方案

如果需要更灵活的成员信息处理(比如将SID转换为账户名、获取账户描述等),可以结合LookupAccountSid函数,但对于单纯获取组内成员的场景,NetLocalGroupGetMembers已经足够简洁高效。

内容的提问来源于stack exchange,提问作者Bharath Suresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:52:50