Pergunta

Eu estou tentando trabalhar para fora como para detectar se um usuário está sendo executado com direitos de administrador no Windows XP. Isto é bastante fácil de fazer em Vista / Win7 graças à whoami comando . Aqui está um trecho em Ruby para saber como fazê-lo sob Vista:

Note, o seguinte link agora incorpora a solução sugerida por muteW

http://gist.github.com/65931

O problema é que whoami não vem com Windows XP e assim o método acima ligada sempre retornará false no WinXP, mesmo se nós estamos correndo como um administrador.

Então, alguém sabe de uma maneira de detectar se estamos correndo como um administrador no Windows XP usando Ruby, ferramentas de linha de comando, arquivos batch, ou mesmo de terceiros (precisa ser open source, realmente) ferramentas?

Foi útil?

Solução

Isto irá detectar se o usuário está executando no modo elevado (por exemplo, um prompt de comando que foi "Executar como" Administrador). Ele se baseia no fato de que você precisa de privilégios de administrador para ler a chave conta SERVIÇO reg LOCAL:

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

isso irá retornar um código de erro diferente de zero se não puder ser lido, e zero se ele pode.
Obras de XP até ...

Outras dicas

Se você executar

>net localgroup administrators 

num shell de comandos que você deve obter a lista de contas de administrador no Windows XP. Basta analisar e digitalizar a saída para verificar se a conta de usuário que deseja. Por exemplo para verificar se o usuário atual é um administrador que você poderia fazer -

>net localgroup administrators | find "%USERNAME%"

opção Piskvor sua multa, ou verificar este url http: // weseetips. cOM / 2008/04/16 / how-to-check-se-current-user-ter-administrador de privilégios /

este é o código nessa página

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;

Este vai descobrir sem descascar para fora:

require 'win32/registry'

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

A estratégia é semelhante a Pedro, mas com menos sobrecarga.

Aqui é o melhor (PowerShell) maneira de fazê-lo: https://stackoverflow.com/a/16617861/863980

Em uma linha, você pode dizer (copiar / colar na elegante e irá funcionar):

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

=> retornos True quando o utilizador pertence ao grupo de administradores (em oposição à verificação de utilizador é Administrador)

(Nota: crase ou acento grave `escapa o retorno de carro em PowerShell, em Ruby ele executa os comandos shell, como C ++ 's do sistema (' comando ') ..)

Assim, em Ruby, você pode dizer (copiar / colar no 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

Não sei a (ainda melhor) maneira WMI de fazê-lo embora. Com isso, você poderia ter feito algo como (em Ruby novamente):

require 'win32ole'
wmi = WIN32OLE.connect('WinNT://./Administrators,group')
# don't know what should come here...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top