2016-07-29 14 views
0

アクティブなユーザーのレジストリ値をHKEY_CURRENT_USERに設定するシステムサービスを作成しました。私は以下のコードを書いた。しかし、それはシステムレベルのレジストリ値を取得するだけで、アクティブなユーザーのレジストリ値を取得できないようです。以下のコードを参照してください。問題はどこだ?何か不足していますか?システムサービスからRegOpenCurrentUserを使用してもユーザーレベルのレジストリ値を取得できません

void GetUserRegistryFromSystemService() 
{ 
#ifdef Q_OS_WIN 

    DWORD sessionId = WTSGetActiveConsoleSessionId(); 
    qInfo() << "Session ID = " << sessionId; 

    wchar_t * ppUserName[100]; 
    DWORD sizeOfUserName; 
    WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, sessionId, WTSUserName, ppUserName, &sizeOfUserName); 
    qInfo() << "Windows User Name = " << QString::fromWCharArray(*ppUserName); 

    std::wstring strValueOfBinDir = L"Unknown Value"; 
    LONG regOpenResult = ERROR_SUCCESS; 

    HANDLE hUserToken = NULL; 
    HANDLE hFakeToken = NULL; 

    if (WTSQueryUserToken(sessionId, &hUserToken)) 
    { 
     if (DuplicateTokenEx(hUserToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 0, SecurityImpersonation, TokenPrimary, &hFakeToken) == TRUE) 
     { 
      qInfo() << "Before ImpersonateLoggedOnUser()......"; 
      if (ImpersonateLoggedOnUser(hFakeToken)) 
      { 
       HKEY hKey; 

       regOpenResult = RegOpenCurrentUser(KEY_READ, &hKey); 
       if (regOpenResult != ERROR_SUCCESS) 
       { 
        qCritical() << "Failed to call RegOpenCurrentUser(), Error is " << regOpenResult; 
       } 

       // Fails to get this hive, will get the default value "Unkown" 
       RegOpenKeyEx(HKEY_CURRENT_USER, 
          TEXT("Software\\Baidu\\BaiduYunGuanjia"), 
          0, 
          KEY_READ, 
          &hKey); 
       GetStringRegKey(hKey, TEXT("installDir"), strValueOfBinDir, TEXT("Unknown")); 

       // It can get the following hive successfully 
       // RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
       //    TEXT("Software\\GitForWindows"), 
       //    0, 
       //    KEY_READ, 
       //    &hKey); 
       // GetStringRegKey(hKey, TEXT("InstallPath"), strValueOfBinDir, TEXT("Unknown")); 

       RevertToSelf(); 
      } 
      else 
      { 
       qCritical() << "Failed to ImpersonateLoggedOnUser..."; 
      } 
      CloseHandle(hFakeToken); 
     } 
     else 
     { 
      qCritical() << "Failed to call DuplicateTokenEx..."; 
     } 
     CloseHandle(hUserToken); 
    } 
    else 
    { 
     qCritical() << "Failed to get the user token of session " << sessionId; 
    } 

    qInfo() << "The value of Registry is " << QString::fromWCharArray(strValueOfBinDir.c_str()); 

#endif 
} 

答えて

2

あなたはHKEYハンドルを使用する必要がありますがRegOpenKeyExの代わりHKEY_CURRENT_USERRegOpenCurrentUserから受け取っ:

regOpenResult = RegOpenCurrentUser(KEY_READ, &hKey); 
if (regOpenResult != ERROR_SUCCESS) 
{ 
    qCritical() << "Failed to call RegOpenCurrentUser(), Error is " << regOpenResult; 
} 
HKEY hSubKey; 
// Fails to get this hive, will get the default value "Unkown" 
RegOpenKeyEx(hKey, TEXT("Software\\Baidu\\BaiduYunGuanjia"), 0, KEY_READ, &hSubKey); 
+0

あなたは正しいです! – Finix

関連する問題