154 lines
4.5 KiB
C
154 lines
4.5 KiB
C
|
#include <windows.h>
|
||
|
#include <userenv.h>
|
||
|
|
||
|
//
|
||
|
// Some helpful tips about group policy extensions
|
||
|
//
|
||
|
// 1) You will be called in the LocalSystem's context
|
||
|
// If you need to access the net, you'll need to impersonate
|
||
|
// the user via the hToken passed in.
|
||
|
//
|
||
|
//
|
||
|
|
||
|
|
||
|
|
||
|
#define GPEXT_PATH TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\GPExtensions\\{febf1208-8aff-11d2-a8a1-00c04fbbcfa2}")
|
||
|
#define GPEXT_NAME TEXT("Group Policy client side extension sample")
|
||
|
|
||
|
|
||
|
|
||
|
BOOL WINAPI LibMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
|
||
|
{
|
||
|
switch (dwReason)
|
||
|
{
|
||
|
case DLL_PROCESS_ATTACH:
|
||
|
{
|
||
|
DisableThreadLibraryCalls (hInstance);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
DWORD ProcessGroupPolicy ( DWORD dwFlags,
|
||
|
HANDLE hToken,
|
||
|
HKEY hKeyRoot,
|
||
|
PGROUP_POLICY_OBJECT pDeletedGPOList,
|
||
|
PGROUP_POLICY_OBJECT pChangedGPOList,
|
||
|
ASYNCCOMPLETIONHANDLE pHandle,
|
||
|
BOOL* pbAbort,
|
||
|
PFNSTATUSMESSAGECALLBACK pStatusCallback )
|
||
|
{
|
||
|
PGROUP_POLICY_OBJECT pCurGPO;
|
||
|
|
||
|
if (dwFlags & GPO_INFO_FLAG_MACHINE)
|
||
|
OutputDebugString (TEXT("GPEXT: Machine GPO\r\n"));
|
||
|
|
||
|
if (dwFlags & GPO_INFO_FLAG_BACKGROUND)
|
||
|
OutputDebugString (TEXT("GPEXT: Background processing of GPO\r\n"));
|
||
|
|
||
|
if (dwFlags & GPO_INFO_FLAG_SLOWLINK)
|
||
|
OutputDebugString (TEXT("GPEXT: Policy is being applied across a slow link.\r\n"));
|
||
|
|
||
|
if (dwFlags & GPO_INFO_FLAG_VERBOSE)
|
||
|
OutputDebugString (TEXT("GPEXT: Verbose policy logging is requested (to the eventlog).\r\n"));
|
||
|
|
||
|
if (dwFlags & GPO_INFO_FLAG_NOCHANGES)
|
||
|
OutputDebugString (TEXT("GPEXT: No changes where detected in this series of GPOs. Policy should be refreshed as quickly as possible.\r\n"));
|
||
|
|
||
|
if (dwFlags & GPO_INFO_FLAG_LINKTRANSITION)
|
||
|
OutputDebugString (TEXT("GPEXT: Link speed transition (either slow to fast or fast to slow)\r\n"));
|
||
|
|
||
|
//
|
||
|
// Process list of deleted GPOs
|
||
|
//
|
||
|
|
||
|
OutputDebugString (TEXT("GPEXT: Processing deleted GPO list\n"));
|
||
|
|
||
|
for (pCurGPO = pDeletedGPOList; pCurGPO; pCurGPO = pCurGPO->pNext)
|
||
|
{
|
||
|
if ( *pbAbort )
|
||
|
{
|
||
|
OutputDebugString (TEXT("GPEXT: Aborting further processing\n"));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
OutputDebugString (pCurGPO->lpDisplayName);
|
||
|
OutputDebugString (TEXT(" aka "));
|
||
|
OutputDebugString (pCurGPO->szGPOName);
|
||
|
OutputDebugString (TEXT(".\r\n"));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Process list of changed GPOs
|
||
|
//
|
||
|
|
||
|
OutputDebugString (TEXT("GPEXT: Processing changed GPO list\n"));
|
||
|
|
||
|
for (pCurGPO = pChangedGPOList; pCurGPO; pCurGPO = pCurGPO->pNext)
|
||
|
{
|
||
|
if ( *pbAbort )
|
||
|
{
|
||
|
OutputDebugString (TEXT("GPEXT: Aborting further processing\n"));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
OutputDebugString (pCurGPO->lpDisplayName);
|
||
|
OutputDebugString (TEXT(" aka "));
|
||
|
OutputDebugString (pCurGPO->szGPOName);
|
||
|
OutputDebugString (TEXT(".\r\n"));
|
||
|
}
|
||
|
|
||
|
return ERROR_SUCCESS;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DllRegisterServer - Adds entries to the system registry
|
||
|
|
||
|
STDAPI DllRegisterServer(void)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
LONG lResult;
|
||
|
DWORD dwDisp, dwValue;
|
||
|
|
||
|
lResult = RegCreateKeyEx (HKEY_LOCAL_MACHINE, GPEXT_PATH, 0, NULL,
|
||
|
REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
|
||
|
&hKey, &dwDisp);
|
||
|
|
||
|
if (lResult != ERROR_SUCCESS)
|
||
|
{
|
||
|
return lResult;
|
||
|
}
|
||
|
|
||
|
RegSetValueEx (hKey, NULL, 0, REG_SZ, (LPBYTE)GPEXT_NAME,
|
||
|
(lstrlen(GPEXT_NAME) + 1) * sizeof(TCHAR));
|
||
|
|
||
|
|
||
|
RegSetValueEx (hKey, TEXT("ProcessGroupPolicy"), 0, REG_SZ, (LPBYTE)TEXT("ProcessGroupPolicy"),
|
||
|
(lstrlen(TEXT("ProcessGroupPolicy")) + 1) * sizeof(TCHAR));
|
||
|
|
||
|
RegSetValueEx (hKey, TEXT("DllName"), 0, REG_EXPAND_SZ, (LPBYTE)TEXT("gpext.dll"),
|
||
|
(lstrlen(TEXT("gpext.dll")) + 1) * sizeof(TCHAR));
|
||
|
|
||
|
dwValue = 1;
|
||
|
RegSetValueEx (hKey, TEXT("NoGPOListChanges"), 0, REG_DWORD, (LPBYTE)&dwValue,
|
||
|
sizeof(dwValue));
|
||
|
|
||
|
RegCloseKey (hKey);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// DllUnregisterServer - Removes entries from the system registry
|
||
|
|
||
|
STDAPI DllUnregisterServer(void)
|
||
|
{
|
||
|
|
||
|
RegDeleteKey (HKEY_LOCAL_MACHINE, GPEXT_PATH);
|
||
|
|
||
|
return S_OK;
|
||
|
}
|