从注册表中检索注销用户的SID

时间:2018-06-22 06:58:40

标签: c++ winapi registry

我想列出PC上的所有用户,我可以通过列出HKEY_USERS注册表下的所有子项来做到这一点。但是我遇到了一个问题。如果用户已注销,则不会显示sid。 关于如何检索已注销用户的sid的任何提示? 附注:我的应用程序是由管理员运行的,我不知道用户,他们的个人资料名称或密码。因此,请记住这一点。

1 个答案:

答案 0 :(得分:0)

您可以使用NetUserEnum来枚举用户(如先前被提名为重复的问题所示)。

虽然不会获得每个用户的SID。最能为您提供的是每个用户的RID。

获取枚举的每个用户的SID的一种方法是给用户NetUserGetInfo,为其指定由NetUserEnum返回的用户名:

#define STRICT
#include <windows.h>
#include <lmaccess.h>
#include <lmapibuf.h>
#include <Sddl.h>
#include <stdio.h>

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

int main(void) {

    USER_INFO_0 *buffer;
    DWORD entries;
    DWORD total_entries;
    DWORD resume_handle = 0;

    do { 
        NetUserEnum(NULL, 
            0,
            FILTER_NORMAL_ACCOUNT, 
            (BYTE **)&buffer, 
            4096, 
            &entries, 
            &total_entries, 
            &resume_handle);

        for (unsigned i = 0; i < entries; i++) {
            USER_INFO_23 *info;
            NetUserGetInfo(NULL, buffer[i].usri0_name, 23, (LPBYTE *)&info);
            LPTSTR string_sid;
            ConvertSidToStringSid(info->usri23_user_sid, &string_sid);
            printf("%-20.20S\t%s\n", buffer[i].usri0_name, string_sid);
            NetApiBufferFree(info);
        }    
        NetApiBufferFree(buffer);    
    } while ( resume_handle != 0);
}

但是,尽管他所提名的副本并没有(完全)回答您的问题,但我同意David Heffernan的观点,这可能不是解决您遇到的问题的好方法。