Определить, работает ли он с правами администратора в Windows XP

StackOverflow https://stackoverflow.com/questions/560366

Вопрос

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

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

http://gist.github.com/65931

Проблема в том, что 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...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top