Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Le applicazioni client speciali possono richiamare operazioni con privilegi. Ad esempio, un'applicazione potrebbe consentire a un responsabile di riavviare un computer ufficio non rispondente. Usando Strumentazione gestione Windows (WMI), è possibile eseguire un'operazione con privilegi chiamando il provider WMI per l'operazione con privilegi.
La procedura seguente descrive come chiamare un provider per un'operazione con privilegi.
Per chiamare un provider per un'operazione con privilegi
Ottenere l'autorizzazione affinché il processo client esegua l'operazione con privilegi.
In genere, un amministratore imposta le autorizzazioni usando gli strumenti di amministrazione del sistema, prima di eseguire il processo.
Richiedere l'autorizzazione per il processo del provider per abilitare l'operazione privilegiata.
In genere, è possibile impostare le autorizzazioni del provider con una chiamata alla funzione AdjustTokenPrivileges.
Ottenere l'autorizzazione per il processo client per abilitare l'operazione con privilegi.
Questo passaggio è necessario solo se il provider è locale per il client. Se il client e il provider esistono nello stesso computer, il client deve abilitare in modo specifico l'operazione con privilegi usando una delle tecniche seguenti:
- Se il client è proprietario del processo, il client può usare AdjustTokenPrivileges per modificare il token di processo prima di chiamare WMI. In questo caso, non è necessario codificare ulteriormente.
- Se il client non riesce ad accedere al token client, il client può usare la procedura seguente per creare un token di thread e usare AdjustTokenPrivileges su tale token.
La procedura seguente descrive come creare un token di thread e usare AdjustTokenPrivileges su tale token.
Per creare un token di thread e usare AdjustTokenPrivileges in tale token
Creare una copia del token di processo chiamando ImpersonateSelf.
Recuperare il token del thread appena creato chiamando GetTokenInformation.
Abilitare l'operazione con privilegi con una chiamata a AdjustTokenPrivileges sul nuovo token.
Ottenere un puntatore a IWbemServices.
Maschera il puntatore a IWbemServices con una chiamata a CoSetProxyBlanket.
Ripetere i passaggi da 1 a 5 per ogni chiamata a WMI.
Nota
È necessario ripetere i passaggi perché COM memorizza nella cache i token in modo non corretto.
L'esempio di codice in questo argomento richiede che l'istruzione #include seguente venga compilata correttamente.
#include <wbemidl.h>
Nell'esempio di codice seguente viene illustrato come abilitare i privilegi in un computer locale.
// 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;