通过读注册表的方法获得 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);
}
}
“我们可以通过读注册表的方法获得 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);
}
}
相关文章推荐
- Request.Referer的乱码终极解决方法+获得用户是用什么关键字通过搜索引擎进来的
- 在c#中过滤通过System.IO.Directory.GetDirectories 方法获取的是所有的子目录和文件中的系统隐藏的文件(夹)的方法
- 如何通过ADO获得Access数据库中的所有用户表和表信息
- java通过反射+javassist获得方法所有信息(返回值、方法名、参数类型列表、参数列表)
- java之通过反射,来获得某对象的所有方法(类方法提取器)
- 通过登陆IP记录Linux所有用户登录所操作日志的方法
- 如何通过ADO获得Access数据库中的所有用户表和表信息
- Oracle下导出某用户所有表的方法(备份)
- yii restfull 方法验证用户身份通过token
- 删除当前用户所有表的方法
- Serv_U 安全设置以后出现530 Not logged in, home directory does not exist的解决方法
- Win7 一键获得管理所有权限(最高权限)注册表
- ice调通过iceReplica用所有server instance的方法---客户端控制服务端的负载均衡
- 获得其他进程的所有窗体的方法
- 通过反射机制获得某个类中的属性,构造方法,方法
- json对象转map方法之一,通过遍历json对象的所有key,取出value放入map
- Oracle下导出某用户所有表的方法
- Oracle删除当前用户下所有的表的方法
- 通过注册表设置指定用户启动项的权限
- Android获得所有存储设备位置的最佳方法