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