SECPERF.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:6k
源码类别:

Windows编程

开发平台:

Visual C++

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