Executar operações privilegiadas

As operações com privilégios exigem privilégios de segurança, como SeLoadDriverPrivilege (wbemPrivilegeLoadDriver nas Constantes de API de Script), um privilégio que deve ser habilitado para uma conta que está carregando um driver de dispositivo. Não é possível adicionar privilégios para um administrador ou usuário por meio do WMI, você só pode habilitar privilégios que a conta já tem. Para ver uma lista de privilégios, consulte Privilege_Constants.

Por padrão, um usuário local em um computador pode ler dados estáticos do repositório do WMI, gravar em instâncias fornecidas por provedores e executar métodos de provedor, a menos que o provedor imponha requisitos de segurança especiais próprios. Somente os administradores podem se conectar a um computador remoto, alterar descritores de segurança ou alterar dados estáticos do repositório do WMI, como uma definição de classe do WMI. Todos os privilégios estão habilitados para uma conexão remota. Para obter mais informações, veja Proteger uma conexão remota do WMI.

As constantes de privilégio do C++ diferem daquelas usadas por linguagens de automação, como o Visual Basic. Os scripts devem usar o valor da constante em vez do nome. Para obter mais informações, veja Executar operações com privilégios usando C++ ou Executar operações com privilégios usando VBScript.

Uma causa comum de erros de acesso negados ao usar o WMI é a falta de um privilégio habilitado para operações, como obter todas as instâncias de Win32_NTEventlogFile. Sem habilitar o privilégio SeSecurity, você não pode acessar o arquivo de log de segurança.

O exemplo de código VBScript a seguir mostra como definir o privilégio SeSecurity na cadeia de caracteres do moniker. Quando usado no moniker, o nome do privilégio entre parênteses descarta o "Se" inicial. Para obter mais informações, veja Construir uma cadeia de caracteres de moniker.

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate,(Security)}!\\" _
    & strComputer & "\root\cimv2")
Set colFiles = objWMIService.ExecQuery _
    ("Select * from Win32_NTEventLogFile " _
    & "Where LogFileName='Security'")
For Each LogFile in colFiles
Wscript.Echo LogFile.NumberOfRecords
Next

Constantes de privilégio