Определить, работает ли с правами администратора в Windows XP - PullRequest
13 голосов
/ 18 февраля 2009

Я пытаюсь определить, работает ли пользователь с правами администратора в Windows XP. Это довольно легко сделать в Vista / Win7 благодаря команде whoami . Вот фрагмент кода в Ruby о том, как это сделать в Vista:

Обратите внимание, что следующая ссылка теперь включает решение, предложенное muteW

http://gist.github.com/65931

Проблема в том, что whoami не поставляется с Windows XP, и поэтому вышеупомянутый связанный метод всегда возвращает false в WinXP, даже если мы работаем от имени администратора.

Итак, кто-нибудь знает способ определения того, работаем ли мы в качестве администратора в Windows XP, используя Ruby, инструменты командной строки, пакетные файлы или даже сторонние (на самом деле должен быть с открытым исходным кодом) инструменты?

Ответы [ 6 ]

32 голосов
/ 14 июля 2011

Это обнаружит, если пользователь работает в режиме повышенных прав (например, в командной строке с правами администратора «Запуск от имени»). Он основан на том факте, что вам требуются права администратора для чтения регистрационного ключа LOCAL SERVICE:

reg query "HKU\S-1-5-19"

это вернет ненулевой код ошибки, если он не может быть прочитан, и ноль, если это возможно.
Работает от XP до ...

11 голосов
/ 18 февраля 2009

Если вы запустите

>net localgroup administrators 

в командной оболочке вы должны получить список учетных записей администраторов в Windows XP. Просто проанализируйте и отсканируйте выходные данные, чтобы найти нужную учетную запись пользователя. Например, чтобы проверить, является ли текущий пользователь администратором, которого вы можете сделать -

>net localgroup administrators | find "%USERNAME%"
7 голосов
/ 18 февраля 2009

Piskvor вариант его хорошо, или проверьте этот URL http://weseetips.com/2008/04/16/how-to-check-whether-current-user-have-administrator-privilege/

это код на этой странице

SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup;
// Initialize SID.
if( !AllocateAndInitializeSid( &NtAuthority,
                               2,
                               SECURITY_BUILTIN_DOMAIN_RID,
                               DOMAIN_ALIAS_RID_ADMINS,
                               0, 0, 0, 0, 0, 0,
                               &AdministratorsGroup))
{
    // Initializing SID Failed.
    return false;
}
// Check whether the token is present in admin group.
BOOL IsInAdminGroup = FALSE;
if( !CheckTokenMembership( NULL,
                           AdministratorsGroup,
                           &IsInAdminGroup ))
{
    // Error occurred.
    IsInAdminGroup = FALSE;
}
// Free SID and return.
FreeSid(AdministratorsGroup);
return IsInAdminGroup;
2 голосов
/ 05 февраля 2014

Это выяснит без выстрелов:

require 'win32/registry'

is_admin = false
begin
  Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
  is_admin = true
rescue
end

Стратегия аналогична стратегии Питера, но с меньшими накладными расходами.

2 голосов
/ 18 февраля 2009

Проверьте метод CheckTokenMembership . Существует пример реализации IsUserAdmin (), а также некоторые другие полезные отзывы сообщества о том, когда эта функция не возвращает ожидаемого и что нужно сделать, чтобы улучшить его.

1 голос
/ 11 октября 2014

Вот лучший (PowerShell) способ сделать это: https://stackoverflow.com/a/16617861/863980

В одной строке вы можете сказать (скопируйте / вставьте в шикарный, и это будет работать):

(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"

=> возвращает True, когда пользователь входит в группу администраторов (в отличие от проверки пользователя IS Administrator)

(Примечание: обратный удар или серьезный акцент `избегает возврата каретки в PowerShell, в Ruby он выполняет команды оболочки, такие как система C ++ ('command') ..)

Итак, в Ruby вы можете сказать (скопировать / вставить в irb):

def is_current_user_local_admin?
  return `powershell "(@(([ADSI]'WinNT://./Administrators,group').psbase.Invoke('Members')) | foreach {$_.GetType().InvokeMember('Name', 'GetProperty', $null, $_, $null)}) -contains 'Administrator'"`.include? "True"
end

Не знаю (даже лучше) WMI способ сделать это, хотя. С этим вы могли бы сделать что-то вроде (снова в Ruby):

require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...
...