Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Specjalne aplikacje klienckie mogą wywoływać operacje uprzywilejowane. Na przykład aplikacja może umożliwić menedżerowi ponowne uruchomienie komputera biurowego, który nie odpowiada. Za pomocą instrumentacji zarządzania Windows (WMI) można wykonać uprzywilejowaną operację, wywołując dostawcę WMI dla operacji uprzywilejowanej.
Poniższa procedura opisuje sposób kontaktowania się z dostawcą w celu wykonania operacji uprzywilejowanej.
Aby wywołać dostawcę dla operacji uprzywilejowanej
Uzyskaj uprawnienia dla procesu klienta, aby wykonać operację uprzywilejowaną.
Zazwyczaj administrator ustawia uprawnienia przy użyciu narzędzi administracyjnych systemu — przed uruchomieniem procesu.
Uzyskaj uprawnienia dla procesu dostawcy, aby umożliwić operację uprzywilejowaną.
Zazwyczaj można ustawić uprawnienia dostawcy za pomocą wywołania funkcji AdjustTokenPrivileges.
Uzyskaj uprawnienia do procesu klienta, aby umożliwić przeprowadzenie operacji uprzywilejowanej.
Ten krok jest niezbędny tylko wtedy, gdy dostawca jest lokalny dla klienta. Jeśli klient i dostawca istnieją na tym samym komputerze, klient musi w szczególności włączyć operację uprzywilejowaną przy użyciu jednej z następujących technik:
- Jeśli klient jest właścicielem procesu, może użyć AdjustTokenPrivileges do dostosowania tokenu procesu przed wywołaniem usługi WMI. W takim przypadku nie trzeba kodować dalej.
- Jeśli klient nie może uzyskać dostępu do tokenu klienta, klient może użyć poniższej procedury, aby utworzyć token wątku i użyć AdjustTokenPrivileges na tym tokenie.
Poniższa procedura opisuje sposób tworzenia tokenu wątku i używania AdjustTokenPrivileges na tym tokenie.
Aby utworzyć token wątku i użyć funkcji AdjustTokenPrivileges na tym tokenie
Utwórz kopię tokenu procesu, wywołując ImpersonateSelf.
Pobierz nowo utworzony token wątku, wywołując GetTokenInformation.
Włącz operację uprzywilejowaną za pomocą wywołania polecenia AdjustTokenPrivileges na nowym tokenie.
Uzyskaj wskaźnik IWbemServices.
Zamaskuj wskaźnik IWbemServices za pomocą wywołania CoSetProxyBlanket.
Powtórz kroki od 1 do 5 dla każdego wywołania usługi WMI.
Notatka
Należy powtórzyć kroki, ponieważ COM niepoprawnie buforuje tokeny.
Przykład kodu w tym temacie wymaga następującej instrukcji #include w celu poprawnego skompilowania.
#include <wbemidl.h>
Poniższy przykład kodu pokazuje, jak włączyć uprawnienia na komputerze lokalnym.
// 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;