Index: rlz/win/lib/process_info.cc |
diff --git a/rlz/win/lib/process_info.cc b/rlz/win/lib/process_info.cc |
index 7068cfb40fe80a42762e42eeaa616405a5b87fac..4b83f384b3198fed3b1c06e36bbe12d824161d85 100644 |
--- a/rlz/win/lib/process_info.cc |
+++ b/rlz/win/lib/process_info.cc |
@@ -7,83 +7,17 @@ |
#include "rlz/win/lib/process_info.h" |
#include <windows.h> |
-#include <Sddl.h> // For ConvertSidToStringSid. |
-#include <LMCons.h> // For UNLEN |
-#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
#include "base/process/process_handle.h" |
+#include "base/strings/string16.h" |
#include "base/win/scoped_handle.h" |
+#include "base/win/win_util.h" |
#include "base/win/windows_version.h" |
#include "rlz/lib/assert.h" |
namespace { |
-HRESULT GetCurrentUser(std::wstring* name, |
- std::wstring* domain, |
- std::wstring* sid) { |
- DWORD err; |
- |
- // Get the current username & domain the hard way. (GetUserNameEx would be |
- // nice, but unfortunately requires connectivity to a domain controller. |
- // Useless.) |
- |
- // (Following call doesn't work if running as a Service - because a Service |
- // runs under special accounts like LOCAL_SYSTEM, not as the logged in user. |
- // In which case, search for and use the process handle of a running |
- // Explorer.exe.) |
- HANDLE token; |
- |
- CHECK(::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &token)); |
- |
- base::win::ScopedHandle scoped_process_token(token); |
- |
- // (Following call will fail with ERROR_INSUFFICIENT_BUFFER and give us the |
- // required size.) |
- scoped_ptr<char[]> token_user_bytes; |
- DWORD token_user_size; |
- DWORD token_user_size2; |
- BOOL result = ::GetTokenInformation(token, TokenUser, NULL, 0, |
- &token_user_size); |
- err = ::GetLastError(); |
- CHECK(!result && err == ERROR_INSUFFICIENT_BUFFER); |
- |
- token_user_bytes.reset(new char[token_user_size]); |
- CHECK(token_user_bytes.get()); |
- |
- CHECK(::GetTokenInformation(token, TokenUser, token_user_bytes.get(), |
- token_user_size, &token_user_size2)); |
- |
- WCHAR user_name[UNLEN + 1]; // max username length |
- WCHAR domain_name[UNLEN + 1]; |
- DWORD user_name_size = UNLEN + 1; |
- DWORD domain_name_size = UNLEN + 1; |
- SID_NAME_USE sid_type; |
- TOKEN_USER* token_user = |
- reinterpret_cast<TOKEN_USER*>(token_user_bytes.get()); |
- CHECK(token_user); |
- |
- PSID user_sid = token_user->User.Sid; |
- CHECK(::LookupAccountSidW(NULL, user_sid, user_name, &user_name_size, |
- domain_name, &domain_name_size, &sid_type)); |
- |
- if (name != NULL) { |
- *name = user_name; |
- } |
- if (domain != NULL) { |
- *domain = domain_name; |
- } |
- if (sid != NULL) { |
- LPWSTR string_sid; |
- ConvertSidToStringSidW(user_sid, &string_sid); |
- *sid = string_sid; // copy out to cstring |
- // free memory, as documented for ConvertSidToStringSid |
- LocalFree(string_sid); |
- } |
- |
- return S_OK; |
-} |
- |
HRESULT GetElevationType(PTOKEN_ELEVATION_TYPE elevation) { |
if (!elevation) |
return E_POINTER; |
@@ -149,13 +83,12 @@ bool GetUserGroup(long* group) { |
namespace rlz_lib { |
bool ProcessInfo::IsRunningAsSystem() { |
- static std::wstring name; |
- static std::wstring domain; |
- static std::wstring sid; |
- if (name.empty()) |
- CHECK(SUCCEEDED(GetCurrentUser(&name, &domain, &sid))); |
- |
- return (name == L"SYSTEM"); |
+ static base::string16 user_sid; |
+ if (user_sid.empty()) { |
+ if (!base::win::GetUserSidString(&user_sid)) |
+ return false; |
+ } |
+ return (user_sid == L"S-1-5-18"); |
} |
bool ProcessInfo::HasAdminRights() { |