您的位置:首页 > 其它

通过读注册表的方法获得 home directory:所有用户

2015-05-19 08:52 260 查看
微软的在线工程师首先提供了上面的方法(即使用 NetUserGetInfo 函数)。在知晓结果不正确之后,又提出了另一个方法:查找注册表。高!不是一般的高!难道这就是传说中的高手,高手,高高手!?
“我们可以通过读注册表的方法获得 home directory:所有用户的 home directory 都可以在 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProfileList

下找到,可以通过 user account name (LookupAccountName )获得该用户的 SID,在通过 SID 获得 home directory。”——注:是该注册表项的一个子项“S-1-......”。该子项下,名为“ProfileImagePath”的二进制键所对应的值就是那个目录路径,“Sid”的多字符串值就是用户名对应的 SID 值。
这是那位高手的原话。郭轩——微软全球技术支持中心在线技术支持工程师。很奇怪,微软全球技术支持中心是不是只有这一位在线技术支持工程师?因为前些日子,一个同事也在那里提问题,也是他回答的。看过一些其它的帖子,好像也都是他给出答案。真奇怪。
不管怎样,这个问题算是解决了。获得指定用户名称所对应的目录方法为:
BYTE abSID[128];

PSID psid = (PSID)&abSID;

DWORD cbSid = 100;

TCHAR ReferencedDomainName[MAX_PATH];

DWORD cchReferencedDomainName = MAX_PATH;

SID_NAME_USE eUser;
if (::LookupAccountName(NULL, _T("用户名"), psid, &cbSid, ReferencedDomainName, &cchReferencedDomainName , &eUser))

{

TCHAR szBuffer[MAX_PATH]; // SID 字符串

GetSidString(psid, szBuffer);

}

// 使SID信息转换成字符串显示出来

void GetSidString(PSID pSid, TCHAR * szBuffer)

{

SID_IDENTIFIER_AUTHORITY *psia = GetSidIdentifierAuthority( pSid );

DWORD dwTopAuthority = psia->Value[5];

_stprintf(szBuffer, _T("S-1-%lu"), dwTopAuthority);
TCHAR szTemp[32];

int iSubAuthorityCount = *(GetSidSubAuthorityCount(pSid));
for (int i = 0; i < iSubAuthorityCount; i++)

{

DWORD dwSubAuthority = *(GetSidSubAuthority(pSid, i));

_stprintf(szTemp, _T("-%lu"), dwSubAuthority);

_tcscat(szBuffer, szTemp);

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: