Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Aplicativos cliente especiais podem invocar operações privilegiadas. Por exemplo, um aplicativo pode permitir que um gerente reinicie um computador de escritório que não responde. Usando a Instrumentação de Gerenciamento do Windows (WMI), você pode executar uma operação privilegiada chamando o provedor WMI para a operação privilegiada.
O procedimento a seguir descreve como chamar um provedor para uma operação privilegiada.
Para chamar um provedor para uma operação privilegiada
Obtenha permissões para que o processo do cliente execute a operação privilegiada.
Normalmente, um administrador define as permissões usando ferramentas administrativas do sistema, antes de executar o processo.
Obtenha permissão para o processo do provedor para habilitar a operação privilegiada.
Normalmente, pode definir permissões de fornecedor com uma chamada para a função AdjustTokenPrivileges.
Obtenha autorização para que o processo do cliente possa realizar a operação privilegiada.
Esta etapa é necessária somente se o provedor for local do cliente. Se o cliente e o provedor existirem no mesmo computador, o cliente deve habilitar especificamente a operação privilegiada usando uma das seguintes técnicas:
- Se o cliente for o proprietário do processo, o cliente poderá usar AdjustTokenPrivileges para ajustar o token de processo antes de chamar o WMI. Neste caso, não é necessário codificar mais.
- Se o cliente não puder acessar o token de cliente, o cliente poderá usar o procedimento a seguir para criar um token de thread e usar AdjustTokenPrivileges nesse token.
O procedimento a seguir descreve como criar um token de thread e usar AdjustTokenPrivileges nesse token.
Para criar um token de thread e usar AdjustTokenPrivileges nesse token
Crie uma cópia do token de processo chamando ImpersonateSelf.
Recupere o token de thread recém-criado chamando GetTokenInformation.
Habilite a operação privilegiada com uma chamada para AdjustTokenPrivileges no novo token.
Obter um ponteiro para IWbemServices.
Oculte o ponteiro para IWbemServices com uma chamada para CoSetProxyBlanket.
Repita as etapas 1 a 5 em cada chamada para WMI.
Observação
Você deve repetir as etapas porque COM armazena tokens em cache incorretamente.
O exemplo de código neste tópico requer a seguinte instrução #include para compilar corretamente.
#include <wbemidl.h>
O exemplo de código a seguir mostra como habilitar privilégios em uma máquina local.
// Get the privileges
// The token has been obtained outside the scope of this code sample
// ==================
DWORD dwLen;
bool bRes;
HANDLE hToken;
// obtain dwLen
bRes = GetTokenInformation(
hToken,
TokenPrivileges,
NULL,
0,
&dwLen
);
BYTE* pBuffer = new BYTE[dwLen];
if(pBuffer == NULL)
{
CloseHandle(hToken);
return WBEM_E_OUT_OF_MEMORY;
}
bRes = GetTokenInformation(
hToken,
TokenPrivileges,
pBuffer,
dwLen,
&dwLen
);
if (!bRes)
{
CloseHandle(hToken);
delete [] pBuffer;
return WBEM_E_ACCESS_DENIED;
}
// Iterate through all the privileges and enable them all
// ======================================================
TOKEN_PRIVILEGES* pPrivs = (TOKEN_PRIVILEGES*)pBuffer;
for (DWORD i = 0; i < pPrivs->PrivilegeCount; i++)
{
pPrivs->Privileges[i].Attributes |= SE_PRIVILEGE_ENABLED;
}
// Store the information back in the token
// =========================================
bRes = AdjustTokenPrivileges(
hToken,
FALSE,
pPrivs,
0, NULL, NULL
);
delete [] pBuffer;
CloseHandle(hToken);
if (!bRes)
return WBEM_E_ACCESS_DENIED;
else
return WBEM_S_NO_ERROR;