SecurityDescriptor Reader.cpp
上传用户:bjlvip
上传日期:2010-02-08
资源大小:744k
文件大小:2k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.    This program reads the security descriptor stored in the DefaultAccessPermission
  3.    value of the HKEY_LOCAL_MACHINESOFTWAREMicrosoftOle key in the registry
  4.    and then displays the security principals enumerated in the DACL
  5.    This program only works on Windows 2000 and Windows NT
  6. */
  7. #include <windows.h>
  8. #include <iostream.h>
  9. void main()
  10. {
  11. cout << "The DefaultAccessPermission value in the " << endl;
  12. cout << "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Ole " << endl;
  13. cout << "registry key contains the following information:" << endl;
  14. // Open the registry key
  15. HKEY hKeyOLE = NULL;
  16. RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Ole", 0, KEY_READ, &hKeyOLE);
  17. // Read the length of the security descriptor
  18. DWORD dwSDSize = 0;
  19. RegQueryValueEx(hKeyOLE, "DefaultAccessPermission", NULL, NULL, NULL, &dwSDSize);
  20. // Read the security descriptor data
  21. SECURITY_DESCRIPTOR* pSD = (SECURITY_DESCRIPTOR*)CoTaskMemAlloc(dwSDSize);
  22. RegQueryValueEx(hKeyOLE, "DefaultAccessPermission", NULL, NULL, (LPBYTE)pSD, &dwSDSize);
  23. RegCloseKey(hKeyOLE);
  24. // Get the DACL
  25. BOOL bHasDacl, bDefaulted;
  26. ACL* pDACL = NULL;
  27. GetSecurityDescriptorDacl(pSD, &bHasDacl, &pDACL, &bDefaulted);
  28. if(pDACL)
  29. {
  30. ACE_HEADER* pAce = NULL;
  31. for(int i = 0; i < pDACL->AceCount; i++)
  32. {
  33. // Retrieve the next ACE
  34. GetAce(pDACL, i, (void**)&pAce);
  35. // Find the account name given the SID in the ACE
  36. TCHAR szUser[_MAX_PATH];
  37. TCHAR szDomain[_MAX_PATH];
  38. DWORD dwUserSize = sizeof(szUser);
  39. DWORD dwDomainSize = sizeof(szDomain);
  40. SID_NAME_USE use;
  41. LookupAccountSid(NULL, &(((ACCESS_ALLOWED_ACE*)pAce)->SidStart),
  42. szUser, &dwUserSize, szDomain, &dwDomainSize, &use);
  43. // Print the principal information
  44. if(pAce->AceType == ACCESS_ALLOWED_ACE_TYPE)
  45. cout << "Allow";
  46. else
  47. cout << "Deny";
  48. cout << " access to principal " << szDomain << "\" << szUser << endl;
  49. }
  50. }
  51. // Free the security descriptor
  52. CoTaskMemFree(pSD);
  53. }