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

 鉴于很多人问我这个问题,我已经很久不写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(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; } 

你可能感兴趣的:(System 权限如何访问当前用户注册表)