2016-07-29 2 views
0

Ich habe einen Systemdienst geschrieben, in dem ich den Registrierungswert des aktiven Benutzers unter HKEY_CURRENT_USER abrufen möchte. Ich habe den Code wie folgt geschrieben. Es scheint jedoch, dass es nur den Registrierungswert auf Systemebene erhalten kann, den Registrierungswert des aktiven Benutzers nicht abrufen kann. Siehe den folgenden Code. Wo ist das Problem? Etwas fehlt?Benutzerregistrierungswert kann nicht abgerufen werden, selbst wenn RegOpenCurrentUser vom Systemdienst verwendet wird

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 
} 

Antwort

2

sollten Sie verwenden HKEY Griff aus RegOpenCurrentUser im RegOpenKeyEx statt HKEY_CURRENT_USER erhalten:

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

Du hast recht !!! – Finix

Verwandte Themen