Обнаружение при запуске с правами администратора в Windows XP
Я пытаюсь выяснить, как определить, работает ли пользователь с правами администратора в Windows XP. Это довольно легко сделать в Vista/Win7 благодаря команде whoami. Вот фрагмент в Ruby для того, как это сделать в Vista:
Обратите внимание, что следующая ссылка теперь включает решение, предложенное muteW
http://gist.github.com/65931
Проблема в том, что whoami не поставляется с Windows XP, и поэтому связанный выше метод всегда будет возвращать false в WinXP, даже если мы работаем как администратор.
Итак, кто-нибудь знает, как определить, запущен ли мы в качестве администратора в Windows XP с использованием Ruby, инструментов командной строки, пакетных файлов или даже сторонних разработчиков (должно быть, с открытым исходным кодом) инструменты?
Ответы
Ответ 1
Это определит, работает ли пользователь в режиме повышенной (например, командная строка, которая была "Run As" Administrator). Он полагается на то, что вам нужны привилегии администратора для чтения ключа реестра учетной записи LOCAL SERVICE:
reg query "HKU\S-1-5-19"
это вернет ненулевой код ошибки, если он не может быть прочитан, и ноль, если он может.
Работает от XP...
Ответ 2
Если вы запустите
>net localgroup administrators
в командной оболочке вы должны получить список учетных записей администратора в Windows XP. Просто проанализируйте и сканируйте вывод, чтобы проверить, какая именно учетная запись вы хотите. Напр. чтобы проверить, может ли текущий пользователь быть администратором -
>net localgroup administrators | find "%USERNAME%"
Ответ 3
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;
Ответ 4
Ознакомьтесь с методом CheckTokenMembership. Существует пример реализации IsUserAdmin() плюс некоторые другие полезные отзывы сообщества о том, когда эта функция не возвращает ожидаемое и что делать, чтобы улучшить ее.
Ответ 5
Это будет обнаружено без обхода:
require 'win32/registry'
is_admin = false
begin
Win32::Registry::HKEY_USERS.open('S-1-5-19') {|reg| }
is_admin = true
rescue
end
Стратегия похожа на Петра, но с меньшими накладными расходами.
Ответ 6
Вот лучший способ (PowerShell): fooobar.com/info/388568/...
В одной строке вы можете сказать (скопируйте/вставьте в шикарное и оно будет работать):
(@(([ADSI]"WinNT://./Administrators,group").psbase.Invoke("Members")) | `
foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -contains "Administrator"
= > возвращает True
, когда пользователь принадлежит группе "Администраторы" (в отличие от проверки администратора IS-сервера)
(Примечание: backtick или серьезный акцент `экранирует возврат каретки в PowerShell, в Ruby он выполняет команды оболочки, такие как С++ system ('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...