📄 userenv.h
字号:
// This function can be called two different ways. Either the hToken for
// a user or machine can be supplied and the correct name and domain
// controller name will be generated, or hToken is NULL and the caller
// must supply the name and the domain controller name.
//
// Calling this function with an hToken ensures the list of Group Policy
// Objects is correct for the user or machine since security access checking
// can be perfomed. If hToken is not supplied, the security of the caller
// is used instead which means that list may or may not be 100% correct
// for the intended user / machine. However, this is the fastest way
// to call this function.
//
// hToken - User or machine token, if NULL, lpName and lpHostName must be supplied
// lpName - User or machine name in DN format, if hToken is supplied, this must be NULL
// lpHostName - Domain DN name or domain controller name. If hToken is supplied, this must be NULL
// lpComputerName - Computer name to use to determine site location. If NULL,
// the local computer is used as the reference. Format: \\machinename
// dwFlags - Flags field. See flags definition below
// pGPOList - Address of a pointer which receives the link list of GPOs
//
//
// Returns: TRUE if successful
// FALSE if not. Use GetLastError() for more details.
//
// Examples:
//
// Here's how this function will typically be called for
// looking up the list of GPOs for a user:
//
// LPGROUP_POLICY_OBJECT pGPOList
//
// if (GetGPOList (hToken, NULL, NULL, NULL, 0, &pGPOList))
// {
// // do processing here...
// FreeGPOList (pGPOList)
// }
//
//
// Here's how this function will typically be called for
// looking up the list of GPOs for a machine:
//
// LPGROUP_POLICY_OBJECT pGPOList
//
// if (GetGPOList (NULL, lpMachineName, lpHostName, lpMachineName,
// GPO_LIST_FLAG_MACHINE, &pGPOList))
// {
// // do processing here...
// FreeGPOList (pGPOList)
// }
//
//=============================================================================
#if(WINVER >= 0x0500)
//
// Each Group Policy Object is associated (linked) with a site, domain,
// organizational unit, or machine.
//
typedef enum _GPO_LINK {
GPLinkUnknown = 0, // No link information available
GPLinkMachine, // GPO linked to a machine (local or remote)
GPLinkSite, // GPO linked to a site
GPLinkDomain, // GPO linked to a domain
GPLinkOrganizationalUnit // GPO linked to a organizational unit
} GPO_LINK, *PGPO_LINK;
typedef struct _GROUP_POLICY_OBJECTA {
DWORD dwOptions; // See GPLink option flags above
DWORD dwVersion; // Revision number of the GPO
LPSTR lpDSPath; // Path to the Active Directory portion of the GPO
LPSTR lpFileSysPath; // Path to the file system portion of the GPO
LPSTR lpDisplayName; // Friendly display name
CHAR szGPOName[50]; // Unique name
GPO_LINK GPOLink; // Link information
LPARAM lParam; // Free space for the caller to store GPO specific information
struct _GROUP_POLICY_OBJECTA * pNext; // Next GPO in the list
struct _GROUP_POLICY_OBJECTA * pPrev; // Previous GPO in the list
LPSTR lpExtensions; // Extensions that are relevant for this GPO
LPARAM lParam2; // Free space for the caller to store GPO specific information
} GROUP_POLICY_OBJECTA, *PGROUP_POLICY_OBJECTA;
typedef struct _GROUP_POLICY_OBJECTW {
DWORD dwOptions; // See GPLink option flags above
DWORD dwVersion; // Revision number of the GPO
LPWSTR lpDSPath; // Path to the Active Directory portion of the GPO
LPWSTR lpFileSysPath; // Path to the file system portion of the GPO
LPWSTR lpDisplayName; // Friendly display name
WCHAR szGPOName[50]; // Unique name
GPO_LINK GPOLink; // Link information
LPARAM lParam; // Free space for the caller to store GPO specific information
struct _GROUP_POLICY_OBJECTW * pNext; // Next GPO in the list
struct _GROUP_POLICY_OBJECTW * pPrev; // Previous GPO in the list
LPWSTR lpExtensions; // Extensions that are relevant for this GPO
LPARAM lParam2; // Free space for the caller to store GPO specific information
} GROUP_POLICY_OBJECTW, *PGROUP_POLICY_OBJECTW;
#ifdef UNICODE
typedef GROUP_POLICY_OBJECTW GROUP_POLICY_OBJECT;
typedef PGROUP_POLICY_OBJECTW PGROUP_POLICY_OBJECT;
#else
typedef GROUP_POLICY_OBJECTA GROUP_POLICY_OBJECT;
typedef PGROUP_POLICY_OBJECTA PGROUP_POLICY_OBJECT;
#endif // UNICODE
//
// dwFlags for GetGPOList()
//
#define GPO_LIST_FLAG_MACHINE 0x00000001 // Return machine policy information
#define GPO_LIST_FLAG_SITEONLY 0x00000002 // Return site policy information only
USERENVAPI
BOOL
WINAPI
GetGPOListA (
IN HANDLE hToken,
IN LPCSTR lpName,
IN LPCSTR lpHostName,
IN LPCSTR lpComputerName,
IN DWORD dwFlags,
OUT PGROUP_POLICY_OBJECTA *pGPOList);
USERENVAPI
BOOL
WINAPI
GetGPOListW (
IN HANDLE hToken,
IN LPCWSTR lpName,
IN LPCWSTR lpHostName,
IN LPCWSTR lpComputerName,
IN DWORD dwFlags,
OUT PGROUP_POLICY_OBJECTW *pGPOList);
#ifdef UNICODE
#define GetGPOList GetGPOListW
#else
#define GetGPOList GetGPOListA
#endif // !UNICODE
#endif /* WINVER >= 0x0500 */
//=============================================================================
//
// FreeGPOList
//
//
// Frees the link list returned from GetGPOList
//
// pGPOList - Pointer to the link list of GPOs
//
//
// Returns: TRUE if successful
// FALSE if not
//
//=============================================================================
#if(WINVER >= 0x0500)
USERENVAPI
BOOL
WINAPI
FreeGPOListA (
IN PGROUP_POLICY_OBJECTA pGPOList);
USERENVAPI
BOOL
WINAPI
FreeGPOListW (
IN PGROUP_POLICY_OBJECTW pGPOList);
#ifdef UNICODE
#define FreeGPOList FreeGPOListW
#else
#define FreeGPOList FreeGPOListA
#endif // !UNICODE
#endif /* WINVER >= 0x0500 */
//=============================================================================
//
// GetAppliedGPOList
//
// Queries for the list of applied Group Policy Objects for the specified
// user or machine and specified client side extension. This function will return
// a linked listof Group Policy Objects. Call FreeGPOList to free the list.
//
// dwFlags - User or machine policy, if it is GPO_LIST_FLAG_MACHINE then
// return machine policy information
// pMachineName - Name of remote computer in the form \\computername. If null
// then local computer is used.
// pSidUser - Security id of user (relevant for user policy). If pMachineName is
// null and pSidUser is null then it means current logged on user.
// If pMachine is null and pSidUser is non-null then it means user
// represented by pSidUser on local machine. If pMachineName is non-null
// then and if dwFlags specifies user policy, then pSidUser must be
// non-null.
// pGuidExtension - Guid of the specified extension
// ppGPOList - Address of a pointer which receives the link list of GPOs
//
// The return value is a Win32 error code. ERROR_SUCCESS means the GetAppliedGPOList
// function completed successfully. Otherwise it indicates that the function failed.
//
//=============================================================================
#if(WINVER >= 0x0500)
USERENVAPI
DWORD
WINAPI
GetAppliedGPOListA (
IN DWORD dwFlags,
IN LPCSTR pMachineName,
IN PSID pSidUser,
IN GUID *pGuidExtension,
OUT PGROUP_POLICY_OBJECTA *ppGPOList);
USERENVAPI
DWORD
WINAPI
GetAppliedGPOListW (
IN DWORD dwFlags,
IN LPCWSTR pMachineName,
IN PSID pSidUser,
IN GUID *pGuidExtension,
OUT PGROUP_POLICY_OBJECTW *ppGPOList);
#ifdef UNICODE
#define GetAppliedGPOList GetAppliedGPOListW
#else
#define GetAppliedGPOList GetAppliedGPOListA
#endif // !UNICODE
#endif /* WINVER >= 0x0500 */
//=============================================================================
//
// Group Policy Object client side extension support
//
// Flags, data structures and function prototype
//
// To register your extension, create a subkey under this key
//
// Software\Microsoft\Windows NT\CurrentVersion\Winlogon\GPExtensions
//
// The subkey needs to be a guid so that it is unique. The noname value of the subkey
// can be the friendly name of the extension. Then add these values:
//
// DllName REG_EXPAND_SZ Path to your DLL
// ProcessGroupPolicy REG_SZ Function name (see PFNPROCESSGROUPPOLICY prototype)
// NoMachinePolicy REG_DWORD True, if extension does not have to be called when
// machine policies are being processed.
// NoUserPolicy REG_DWORD True, if extension does not have to be called when
// user policies are being processed.
// NoSlowLink REG_DWORD True, if extension does not have to be called on a slow link
// NoBackgroundPolicy REG_DWORD True, if extension does not have to be called on.
// policies applied in background.
// NoGPOListChanges REG_DWORD True, if extension does not have to be called when
// there are no changes between cached can current GPO lists.
// PerUserLocalSettings REG_DWORD True, if user policies have to be cached on a per user and
// per machine basis.
// RequiresSuccessfulRegistry REG_DWORD True, if extension should be called only if registry extension
// was successfully processed.
// EnableAsynchronousProcessing REG_DWORD True, if registry extension will complete its processing
// asynchronously.
// NotifyLinkTransition REG_DWORD True, if extension should be called when a change in link
// speed is detected between previous policy application and
// current policy application.
//
// The return value is a Win32 error code. ERROR_SUCCESS means the ProcessGroupPolicy
// function completed successfully. If return value is ERROR_OVERRIDE_NOCHANGES then it
// means that the extension will be called the next time even if NoGPOListChanges is set
// and there are no changes to the GPO list. Any other return value indicates that the
// ProcessGroupPolicy function failed.
//
//=============================================================================
#if(WINVER >= 0x0500)
#define GPO_INFO_FLAG_MACHINE 0x00000001 // Apply machine policy rather than user policy
#define GPO_INFO_FLAG_BACKGROUND 0x00000010 // Background refresh of policy (ok to do slow stuff)
#define GPO_INFO_FLAG_SLOWLINK 0x00000020 // Policy is being applied across a slow link
#define GPO_INFO_FLAG_VERBOSE 0x00000040 // Verbose output to the eventlog
#define GPO_INFO_FLAG_NOCHANGES 0x00000080 // No changes were detected to the Group Policy Objects
#define GPO_INFO_FLAG_LINKTRANSITION 0x00000100 // A change in link speed was detected between previous policy
// application and current policy application
typedef UINT_PTR ASYNCCOMPLETIONHANDLE;
typedef DWORD (*PFNSTATUSMESSAGECALLBACK)(BOOL bVerbose, LPWSTR lpMessage);
typedef DWORD(*PFNPROCESSGROUPPOLICY)(
IN DWORD dwFlags, // GPO_INFO_FLAGS
IN HANDLE hToken, // User or machine token
IN HKEY hKeyRoot, // Root of registry
IN PGROUP_POLICY_OBJECT pDeletedGPOList, // Linked list of deleted GPOs
IN PGROUP_POLICY_OBJECT pChangedGPOList, // Linked list of changed GPOs
IN ASYNCCOMPLETIONHANDLE pHandle, // For asynchronous completion
IN BOOL *pbAbort, // If true, then abort GPO processing
IN PFNSTATUSMESSAGECALLBACK pStatusCallback); // Callback function for displaying status messages
// Note, this can be NULL
//
// GUID that identifies the registry extension
//
#define REGISTRY_EXTENSION_GUID { 0x35378EAC, 0x683F, 0x11D2, 0xA8, 0x9A, 0x00, 0xC0, 0x4F, 0xBB, 0xCF, 0xA2 }
#endif /* WINVER >= 0x0500 */
//=============================================================================
//
// Group Policy Object client side asynchronous extension processing
//
// extensionId - Unique guid identifying the extension
// pAsyncHandle - Asynchronous completion handle that was passed to extension in
// ProcessGroupPolicy call
// dwStatus - Completion status of asynchronous processing
//
// The return value is a Win32 error code. ERROR_SUCCESS means the ProcessGroupPolicyCompleted
// function completed successfully. Otherwise it indicates that the function failed.
//
//=============================================================================
#if(WINVER >= 0x0500)
typedef GUID *REFGPEXTENSIONID;
USERENVAPI
DWORD
WINAPI
ProcessGroupPolicyCompleted(
IN REFGPEXTENSIONID extensionId,
IN ASYNCCOMPLETIONHANDLE pAsyncHandle,
IN DWORD dwStatus);
#endif /* WINVER >= 0x0500 */
#ifdef __cplusplus
}
#endif
#pragma option pop /*P_O_Pop*/
#endif // _INC_USERENV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -