您的位置:首页 > 其它

System 权限如何访问当前用户注册表

2011-04-24 13:27 387 查看
鉴于很多人问我这个问题,我已经很久不写blog, 但是无奈今天再啰嗦一下,

如果是是system 权限,那么请按照如下思路进行:

1. 获得当前用户的token, WTG 函数, explorer 上剥离 都行。

2. 获得当前用户的SID

3. 将SID转换成字符串,

4. 使用HKEY_USER 和用户字符串进行读写当前用户下的键值,因为注册表当前用户仅仅是HKEy_USERS 下的一个映射。

如下简单附带代码:

]int _SetCurrentUserReg( LPCTSTR lpszPath,  LPCTSTR lpszKey, LPCTSTR lpszValue )
{
DWORD dwSesssionID = WTSGetActiveConsoleSessionId();
HANDLE hUserToken = NULL;
BOOL bIsOK = WTSQueryUserToken( dwSesssionID, &hUserToken );
if ( bIsOK )
{
DWORD dwLength = 0;
bIsOK = GetTokenInformation( hUserToken, TokenUser, NULL, 0, &dwLength );
TOKEN_USER *pUser = static_cast<TOKEN_USER*>(malloc( dwLength + 1 ));
if ( NULL == pUser )
{
return -1;
}
bIsOK = GetTokenInformation( hUserToken, TokenUser, pUser, dwLength, &dwLength );
if ( !bIsOK )
{
free(pUser);
return -1;
}
LPWSTR lpUserToken = NULL;
bIsOK = ConvertSidToStringSid( pUser->User.Sid, &lpUserToken );
free(pUser);
if ( !bIsOK )
{
return -1;
}
//HKEY_USERS/S-1-5-21-362780079-2926010819-742269287-1000
CString strPath = _T("%s//%s");
CRegKey theReg;
CString strReg;
strReg.Format( strPath.GetBuffer(), lpUserToken, lpszPath );
LocalFree( lpUserToken );
LONG lRetCode = theReg.Open( HKEY_USERS, strReg.GetBuffer() );
if ( lRetCode != 0 )
{
return  -1;
}
lRetCode = theReg.SetStringValue( lpszKey, lpszValue );
if ( lRetCode != 0 )
{
return  -1;
}
lRetCode = theReg.Close();
if ( lRetCode != 0 )
{
return  -1;
}
return  0;
}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐