//+--------------------------------------------------------------------------- // // Scheduling Agent Service // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: policy.cxx // // Contents: Functions for implementing policy checking // // Classes: None. // // Functions: RegReadPolicyKey // // History: 04/23/98 CameronE created // //---------------------------------------------------------------------------- #include "..\pch\headers.hxx" #pragma hdrstop #include "..\inc\policy.hxx" #include "..\inc\debug.hxx" //+--------------------------------------------------------------------------- // // Function: RegReadPolicyKey // // Synopsis: Determine whether a specified policy value is in the registry // and is on (exists, value > 0x0). Policy on means deny // the user permission to do a particular action in the UI only. // // Arguments: [lpszValue] -- value name, appended to the base key // // Returns: BOOL - true for value > 0 (policy active) // // Notes: None. // // History: 4/14/98 CameronE - created // //---------------------------------------------------------------------------- BOOL RegReadPolicyKey( LPCTSTR lpszValue) { // TRACE_FUNCTION(RegReadPolicyKey) is too verbose schDebugOut((DEB_USER6, "RegReadPolicyKey\n")); // CODEWORK: This function is called way too often. See if we can cache // the results, or at least keep the key handle open. HKEY keyPolicy; BOOL fPolicy = FALSE; DWORD dwType; DWORD dwData; DWORD dwDataSize = sizeof(DWORD); // // It is possible to have a policy key under HKLM and/or HKCU // We assume that HKCU can shutoff what HKLM enables, but not vice // versa. // LONG lerr = RegOpenKeyEx( HKEY_LOCAL_MACHINE, TS_KEYPOLICY_BASE, 0, KEY_READ, &keyPolicy); if (lerr == ERROR_SUCCESS) { lerr = RegQueryValueEx( keyPolicy, lpszValue, NULL, &dwType, (BYTE *) &dwData, &dwDataSize); if (lerr == ERROR_SUCCESS) { if (dwType == REG_DWORD) { fPolicy = (dwData > 0); } else { schDebugOut((DEB_ITRACE, "HKLM Policy value not a DWORD!\n")); } } RegCloseKey(keyPolicy); } // // If HKLM policy value has shut off part of the UI on this machine, // return it now, so that HKCU cannot override a stricter machine policy. // if (fPolicy) { return fPolicy; } // // Otherwise, see if maybe it's just this user that can't do this task // lerr = RegOpenKeyEx( HKEY_CURRENT_USER, TS_KEYPOLICY_BASE, 0, KEY_READ, &keyPolicy); dwDataSize = sizeof(DWORD); if (lerr == ERROR_SUCCESS) { lerr = RegQueryValueEx( keyPolicy, lpszValue, NULL, &dwType, (BYTE *) &dwData, &dwDataSize); if (lerr == ERROR_SUCCESS) { if (dwType == REG_DWORD) { fPolicy = (dwData > 0); } else { schDebugOut((DEB_ITRACE, "HKCU Policy value not a DWORD!\n")); } } RegCloseKey(keyPolicy); } return fPolicy; }