home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winbase / security / winnt / secperf / secperf.c < prev    next >
C/C++ Source or Header  |  1996-04-18  |  6KB  |  254 lines

  1. /*++
  2.  
  3. Module Name:
  4.  
  5.     secperf.c
  6.  
  7. Abstract:
  8.  
  9.     This sample illustrates how to regulate access to the performance data
  10.     provided by the registry key HKEY_PERFORMANCE_DATA.
  11.  
  12.     The security on the following registry key dictates which users or groups
  13.     can gain access to the performance data:
  14.  
  15.     HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib
  16.  
  17.     This sample opens the registry key for WRITE_DAC access, which allows
  18.     for a new Dacl to be applied to the registry key.
  19.  
  20.     A Dacl is then built, which grants the following users access:
  21.  
  22.     Administrators are granted full control to allow for future updates to the
  23.     security on the key and to allow for querying performance data.
  24.  
  25.     Interactively logged on users, through the well-known Interactive Sid,
  26.     are granted KEY_READ access, which allows for querying performance
  27.     data.
  28.  
  29.     The new Dacl is then applied to the registry key using the
  30.     RegSetKeySecurity() Win32 API.
  31.  
  32.     This sample relies on the import library advapi32.lib.
  33.  
  34. Author:
  35.  
  36.     Scott Field (sfield)    19-Feb-96
  37.  
  38. --*/
  39.  
  40. #include <windows.h>
  41. #include <stdio.h>
  42.  
  43. #define RTN_OK 0
  44. #define RTN_ERROR 13
  45.  
  46. void
  47. DisplayWinError(
  48.     LPSTR szAPI,    // pointer to Ansi function name
  49.     DWORD dwError   // DWORD WinError
  50.     );
  51.  
  52. int
  53. __cdecl
  54. main(
  55.     void
  56.     )
  57. {
  58.     SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY;
  59.     PSID pInteractiveSid = NULL;
  60.     PSID pAdministratorsSid = NULL;
  61.     SECURITY_DESCRIPTOR sd;
  62.     PACL pDacl = NULL;
  63.     DWORD dwAclSize;
  64.     HKEY hKey;
  65.     LONG lRetCode;
  66.     BOOL bSuccess = FALSE; // assume this function fails
  67.  
  68.     //
  69.     // open the performance key for WRITE_DAC access
  70.     //
  71.     lRetCode = RegOpenKeyEx(
  72.         HKEY_LOCAL_MACHINE,
  73.        TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib"),
  74.         0,
  75.         WRITE_DAC,
  76.         &hKey
  77.         );
  78.  
  79.     if(lRetCode != ERROR_SUCCESS) {
  80.         DisplayWinError("RegOpenKeyEx", lRetCode);
  81.         return RTN_ERROR;
  82.     }
  83.  
  84.     //
  85.     // prepare a Sid representing any Interactively logged-on user
  86.     //
  87.     if(!AllocateAndInitializeSid(
  88.         &sia,
  89.         1,
  90.         SECURITY_INTERACTIVE_RID,
  91.         0, 0, 0, 0, 0, 0, 0,
  92.         &pInteractiveSid
  93.         )) {
  94.         DisplayWinError("AllocateAndInitializeSid", GetLastError());
  95.         goto cleanup;
  96.     }
  97.  
  98.     //
  99.     // preprate a Sid representing the well-known admin group
  100.     //
  101.     if(!AllocateAndInitializeSid(
  102.         &sia,
  103.         2,
  104.         SECURITY_BUILTIN_DOMAIN_RID,
  105.         DOMAIN_ALIAS_RID_ADMINS,
  106.         0, 0, 0, 0, 0, 0,
  107.         &pAdministratorsSid
  108.         )) {
  109.         DisplayWinError("AllocateAndInitializeSid", GetLastError());
  110.         goto cleanup;
  111.     }
  112.  
  113.     //
  114.     // compute size of new acl
  115.     //
  116.     dwAclSize = sizeof(ACL) +
  117.         2 * ( sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) ) +
  118.         GetLengthSid(pInteractiveSid) +
  119.         GetLengthSid(pAdministratorsSid) ;
  120.  
  121.     //
  122.     // allocate storage for Acl
  123.     //
  124.     pDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize);
  125.     if(pDacl == NULL) goto cleanup;
  126.  
  127.     if(!InitializeAcl(pDacl, dwAclSize, ACL_REVISION)) {
  128.         DisplayWinError("InitializeAcl", GetLastError());
  129.         goto cleanup;
  130.     }
  131.  
  132.     //
  133.     // grant the Interactive Sid KEY_READ access to the perf key
  134.     //
  135.     if(!AddAccessAllowedAce(
  136.         pDacl,
  137.         ACL_REVISION,
  138.         KEY_READ,
  139.         pInteractiveSid
  140.         )) {
  141.         DisplayWinError("AddAccessAllowedAce", GetLastError());
  142.         goto cleanup;
  143.     }
  144.  
  145.     //
  146.     // grant the Administrators Sid KEY_ALL_ACCESS access to the perf key
  147.     //
  148.     if(!AddAccessAllowedAce(
  149.         pDacl,
  150.         ACL_REVISION,
  151.         KEY_ALL_ACCESS,
  152.         pAdministratorsSid
  153.         )) {
  154.         DisplayWinError("AddAccessAllowedAce", GetLastError());
  155.         goto cleanup;
  156.     }
  157.  
  158.     if(!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)) {
  159.         DisplayWinError("InitializeSecurityDescriptor", GetLastError());
  160.         goto cleanup;
  161.     }
  162.  
  163.     if(!SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE)) {
  164.         DisplayWinError("SetSecurityDescriptorDacl", GetLastError());
  165.         goto cleanup;
  166.     }
  167.  
  168.     //
  169.     // apply the security descriptor to the registry key
  170.     //
  171.     lRetCode = RegSetKeySecurity(
  172.         hKey,
  173.         (SECURITY_INFORMATION)DACL_SECURITY_INFORMATION,
  174.         &sd
  175.         );
  176.  
  177.     if(lRetCode != ERROR_SUCCESS) {
  178.         DisplayWinError("RegSetKeySecurity", lRetCode);
  179.         goto cleanup;
  180.     }
  181.  
  182.     bSuccess = TRUE; // indicate success
  183.  
  184. cleanup:
  185.  
  186.     RegCloseKey(hKey);
  187.     RegCloseKey(HKEY_LOCAL_MACHINE);
  188.  
  189.     //
  190.     // free allocated resources
  191.     //
  192.     if(pDacl != NULL)
  193.         HeapFree(GetProcessHeap(), 0, pDacl);
  194.  
  195.     if(pInteractiveSid != NULL)
  196.         FreeSid(pInteractiveSid);
  197.  
  198.     if(pAdministratorsSid != NULL)
  199.         FreeSid(pAdministratorsSid);
  200.  
  201.     if(bSuccess) {
  202.         printf("SUCCESS updating performance data security\n");
  203.         return RTN_OK;
  204.     } else {
  205.         printf("ERROR updating performance data security\n");
  206.         return RTN_ERROR;
  207.     }
  208. }
  209.  
  210. void
  211. DisplayWinError(
  212.     LPSTR szAPI,    // pointer to Ansi function name
  213.     DWORD dwError   // DWORD WinError
  214.     )
  215. {
  216.     LPSTR MessageBuffer;
  217.     DWORD dwBufferLength;
  218.  
  219.     //
  220.     // TODO get this fprintf out of here!
  221.     //
  222.     fprintf(stderr,"%s error!\n", szAPI);
  223.  
  224.     if(dwBufferLength=FormatMessageA(
  225.             FORMAT_MESSAGE_ALLOCATE_BUFFER |
  226.             FORMAT_MESSAGE_FROM_SYSTEM,
  227.             NULL,
  228.             dwError,
  229.             MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  230.             (LPSTR) &MessageBuffer,
  231.             0,
  232.             NULL
  233.             ))
  234.     {
  235.         DWORD dwBytesWritten; // unused
  236.  
  237.         //
  238.         // Output message string on stderr
  239.         //
  240.         WriteFile(
  241.                 GetStdHandle(STD_ERROR_HANDLE),
  242.                 MessageBuffer,
  243.                 dwBufferLength,
  244.                 &dwBytesWritten,
  245.                 NULL
  246.                 );
  247.  
  248.         //
  249.         // free the buffer allocated by the system
  250.         //
  251.         LocalFree(MessageBuffer);
  252.     }
  253. }
  254.