首页 > 解决方案 > 从 WindowsAPI 调用 NetLocalGroupAddMembers 时,安全 ID 结构无效错误

问题描述

我想使用 Windows API 中的 NetLocalGroupAddMembers 函数将用户添加到本地管理员组。

    NET_API_STATUS nStatus;
    DWORD dwLevel = 0;
    LOCALGROUP_INFO_0 localGroupInformation;

    localGroupInformation.lgrpi0_name = username;

    nStatus = NetLocalGroupAddMembers(
        NULL,
        TEXT("Administrators"),
        dwLevel,
        (LPBYTE)& localGroupInformation,
        1
    );

但是,当我使用以下命令时,它可以工作:

net localgroup Administrators username /add

谢谢你。

标签: c++windows

解决方案


您必须使用用户SIDLOCALGROUP_MEMBERS_INFO_0结构。

像这样的东西=>

        WCHAR wsName[256] = L"test";
        DWORD dwSidSize = 0;
        DWORD dwDomainSize = 0;
        SID_NAME_USE snu;
        LPWSTR pwszDomain = NULL;
        PSID pSid = NULL;
        LookupAccountName(NULL, wsName, NULL, &dwSidSize, NULL, &dwDomainSize, &snu);
        DWORD dwErr = GetLastError();
        if (dwErr == ERROR_INSUFFICIENT_BUFFER)
        {
            pSid = (PSID)LocalAlloc(LPTR, dwSidSize);
            pwszDomain = (PWSTR)LocalAlloc(LPTR, dwDomainSize * sizeof(WCHAR));
            if (!LookupAccountName(NULL, wsName, pSid, &dwSidSize, pwszDomain, &dwDomainSize, &snu))
            {
                // Handle error
            }
        }
        if (pwszDomain != NULL)
            LocalFree(pwszDomain);
        if (pSid)
        {
            NET_API_STATUS nStatus;
            DWORD dwLevel = 0;
            LOCALGROUP_MEMBERS_INFO_0 localGroupMemberInfo;
            localGroupMemberInfo.lgrmi0_sid = pSid;
            nStatus = NetLocalGroupAddMembers(
                NULL,
                TEXT("Administrators"),
                dwLevel,
                (LPBYTE)&localGroupMemberInfo,
                1
            );
            // Test nStatus...
            LocalFree(pSid);
        }

推荐阅读