security.cpp
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 6k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. //+-------------------------------------------------------------------------
  2. //
  3. //  Microsoft Windows
  4. //
  5. //  Copyright (C) Microsoft Corporation, 1997 - 1999
  6. //
  7. //  File:       security.cpp
  8. //
  9. //--------------------------------------------------------------------------
  10. #include "pch.h"
  11. #pragma hdrstop
  12. #include "security.h"
  13. DWORD 
  14. Security_SetPrivilegeAttrib(
  15.     LPCTSTR PrivilegeName, 
  16.     DWORD NewPrivilegeAttribute, 
  17.     DWORD *OldPrivilegeAttribute
  18.     )
  19. {
  20.     LUID             PrivilegeValue;
  21.     TOKEN_PRIVILEGES TokenPrivileges, OldTokenPrivileges;
  22.     DWORD            ReturnLength;
  23.     HANDLE           TokenHandle;
  24.     //
  25.     // First, find out the LUID Value of the privilege
  26.     //
  27.     if(!LookupPrivilegeValue(NULL, PrivilegeName, &PrivilegeValue)) 
  28.     {
  29.         return GetLastError();
  30.     }
  31.     //
  32.     // Get the token handle
  33.     //
  34.     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle)) 
  35.     {
  36.         return GetLastError();
  37.     }
  38.     //
  39.     // Set up the privilege set we will need
  40.     //
  41.     TokenPrivileges.PrivilegeCount = 1;
  42.     TokenPrivileges.Privileges[0].Luid = PrivilegeValue;
  43.     TokenPrivileges.Privileges[0].Attributes = NewPrivilegeAttribute;
  44.     ReturnLength = sizeof(TOKEN_PRIVILEGES);
  45.     if (!AdjustTokenPrivileges(
  46.                 TokenHandle,
  47.                 FALSE,
  48.                 &TokenPrivileges,
  49.                 sizeof(TOKEN_PRIVILEGES),
  50.                 &OldTokenPrivileges,
  51.                 &ReturnLength
  52.                 )) 
  53.     {
  54.         CloseHandle(TokenHandle);
  55.         return GetLastError();
  56.     }
  57.     else 
  58.     {
  59.         if (NULL != OldPrivilegeAttribute) 
  60.         {
  61.             *OldPrivilegeAttribute = OldTokenPrivileges.Privileges[0].Attributes;
  62.         }
  63.         CloseHandle(TokenHandle);
  64.         return ERROR_SUCCESS;
  65.     }
  66. }
  67. BOOL IsCurrentUserAnAdminMember(VOID)
  68. {
  69.     SID_IDENTIFIER_AUTHORITY authNT = SECURITY_NT_AUTHORITY;
  70.     NTSTATUS Status;
  71.     PSID AdminsDomainSid;
  72.     BOOL bIsAdminMember = FALSE;
  73.     //
  74.     // Create Admins domain sid.
  75.     //
  76.     Status = RtlAllocateAndInitializeSid(
  77.                &authNT,
  78.                2,
  79.                SECURITY_BUILTIN_DOMAIN_RID,
  80.                DOMAIN_ALIAS_RID_ADMINS,
  81.                0, 0, 0, 0, 0, 0,
  82.                &AdminsDomainSid
  83.                );
  84.     if (STATUS_SUCCESS == Status)
  85.     {
  86.         CheckTokenMembership(NULL, AdminsDomainSid, &bIsAdminMember);
  87.         RtlFreeSid(AdminsDomainSid);
  88.     }
  89.     return bIsAdminMember;
  90. }
  91. //
  92. // Returns the SID of the currently logged on user.
  93. // If the function succeeds, use the FreeSid API to 
  94. // free the returned SID structure.
  95. //
  96. HRESULT
  97. GetCurrentUserSid(
  98.     PSID *ppsid
  99.     )
  100. {
  101.     HRESULT hr  = NOERROR;
  102.     DWORD dwErr = 0;
  103.     //
  104.     // Get the token handle. First try the thread token then the process
  105.     // token.  If these fail we return early.  No sense in continuing
  106.     // on if we can't get a user token.
  107.     //
  108.     *ppsid = NULL;
  109.     CWin32Handle hToken;
  110.     if (!OpenThreadToken(GetCurrentThread(),
  111.                          TOKEN_READ,
  112.                          TRUE,
  113.                          hToken.HandlePtr()))
  114.     {
  115.         if (ERROR_NO_TOKEN == GetLastError())
  116.         {
  117.             if (!OpenProcessToken(GetCurrentProcess(),
  118.                                   TOKEN_READ,
  119.                                   hToken.HandlePtr()))
  120.             {
  121.                 dwErr = GetLastError();
  122.                 return HRESULT_FROM_WIN32(dwErr);
  123.             }
  124.         }
  125.         else
  126.         {
  127.             dwErr = GetLastError();
  128.             return HRESULT_FROM_WIN32(dwErr);
  129.         }
  130.     }
  131.     //
  132.     // Find operator's SID.
  133.     //
  134.     LPBYTE pbTokenInfo = NULL;
  135.     DWORD cbTokenInfo = 0;
  136.     cbTokenInfo = 0;
  137.     if (!GetTokenInformation(hToken,
  138.                              TokenUser,
  139.                              NULL,
  140.                              cbTokenInfo,
  141.                              &cbTokenInfo))
  142.     {
  143.         dwErr = GetLastError();
  144.         if (ERROR_INSUFFICIENT_BUFFER == dwErr)
  145.         {
  146.             pbTokenInfo = new BYTE[cbTokenInfo];
  147.         }
  148.         else
  149.         {
  150.             dwErr = GetLastError();
  151.             hr = HRESULT_FROM_WIN32(hr);
  152.         }
  153.     }
  154.     if (SUCCEEDED(hr))
  155.     {
  156.         //
  157.         // Get the user token information.
  158.         //
  159.         if (!GetTokenInformation(hToken,
  160.                                  TokenUser,
  161.                                  pbTokenInfo,
  162.                                  cbTokenInfo,
  163.                                  &cbTokenInfo))
  164.         {
  165.             dwErr = GetLastError();
  166.             hr = HRESULT_FROM_WIN32(dwErr);
  167.         }
  168.         else
  169.         {
  170.             SID_AND_ATTRIBUTES *psa = (SID_AND_ATTRIBUTES *)pbTokenInfo;
  171.             int cbSid = GetLengthSid(psa->Sid);
  172.             *ppsid = (PSID)new BYTE[cbSid];
  173.             if (NULL != *ppsid)
  174.             {
  175.                 CopySid(cbSid, *ppsid, psa->Sid);
  176.                 hr = NOERROR;
  177.             }
  178.             else
  179.             {
  180.                 hr = E_OUTOFMEMORY;
  181.             }
  182.         }
  183.         delete[] pbTokenInfo;
  184.     }
  185.     if (SUCCEEDED(hr) && NULL != *ppsid && !IsValidSid(*ppsid))
  186.     {
  187.         //
  188.         // We created a SID but it's invalid.
  189.         //
  190.         FreeSid(*ppsid);
  191.         *ppsid = NULL;
  192.         hr = HRESULT_FROM_WIN32(ERROR_INVALID_SID);
  193.     }
  194.     return hr;
  195. }
  196. //
  197. // Determines if a given SID is that of the current user.
  198. //
  199. BOOL IsSidCurrentUser(PSID psid)
  200. {
  201.     BOOL bIsCurrent = FALSE;
  202.     PSID psidUser;
  203.     if (SUCCEEDED(GetCurrentUserSid(&psidUser)))
  204.     {
  205.         bIsCurrent = EqualSid(psid, psidUser);
  206.         FreeSid(psidUser);
  207.     }
  208.     return bIsCurrent;
  209. }