• Security Descriptor


     

     

    #include <iostream>
    
    #pragma comment(lib, "advapi32.lib")
    
    #include <windows.h>
    #include <stdio.h>
    #include <aclapi.h>
    #include <tchar.h>
    
    bool IsAdmin()
    {
        //
        // check if token is member of the Administrators group
        //
    
        SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
        PSID AdministratorsGroup;
        BOOL b = AllocateAndInitializeSid(
            &NtAuthority,
            2,
            SECURITY_BUILTIN_DOMAIN_RID,
            DOMAIN_ALIAS_RID_ADMINS,
            0, 0, 0, 0, 0, 0,
            &AdministratorsGroup);
        if (b) {
    
            if (!CheckTokenMembership(NULL, AdministratorsGroup, &b))
                b = FALSE;
    
            FreeSid(AdministratorsGroup);
        }
    
        return b ? true : false;
    }
    
    void main()
    {
        std::cout << "IsAdmin:" << IsAdmin() << "\n";
    
        DWORD dwRes, dwDisposition;
        PSID pEveryoneSID = NULL, pAdminSID = NULL;
        PACL pACL = NULL;
        PSECURITY_DESCRIPTOR pSD = NULL;
        EXPLICIT_ACCESS ea[2];
        SID_IDENTIFIER_AUTHORITY SIDAuthWorld =
            SECURITY_WORLD_SID_AUTHORITY;
        SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
        SECURITY_ATTRIBUTES sa;
        LONG lRes;
        HKEY hkSub = NULL;
        WCHAR cls[MAX_PATH] = _T("");
    
    
        // Create a well-known SID for the Everyone group.
        if (!AllocateAndInitializeSid(&SIDAuthWorld, 1,
            SECURITY_WORLD_RID,
            0, 0, 0, 0, 0, 0, 0,
            &pEveryoneSID))
        {
            _tprintf(_T("AllocateAndInitializeSid Error %u\n"), GetLastError());
            goto Cleanup;
        }
    
        // Initialize an EXPLICIT_ACCESS structure for an ACE.
        // The ACE will allow Everyone read access to the key.
        ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
        ea[0].grfAccessPermissions = KEY_READ;
        ea[0].grfAccessMode = SET_ACCESS;
        ea[0].grfInheritance = NO_INHERITANCE;
        ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
        ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
        ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID;
    
        // Create a SID for the BUILTIN\Administrators group.
        if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
            SECURITY_BUILTIN_DOMAIN_RID,
            DOMAIN_ALIAS_RID_ADMINS,
            0, 0, 0, 0, 0, 0,
            &pAdminSID))
        {
            _tprintf(_T("AllocateAndInitializeSid Error %u\n"), GetLastError());
            goto Cleanup;
        }
    
        // Initialize an EXPLICIT_ACCESS structure for an ACE.
        // The ACE will allow the Administrators group full access to
        // the key.
        ea[1].grfAccessPermissions = KEY_ALL_ACCESS;
        ea[1].grfAccessMode = SET_ACCESS;
        ea[1].grfInheritance = NO_INHERITANCE;
        ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
        ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
        ea[1].Trustee.ptstrName = (LPTSTR)pAdminSID;
    
        // Create a new ACL that contains the new ACEs.
        dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
        if (ERROR_SUCCESS != dwRes)
        {
            _tprintf(_T("SetEntriesInAcl Error %u\n"), GetLastError());
            goto Cleanup;
        }
    
        // Initialize a security descriptor.  
        pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
            SECURITY_DESCRIPTOR_MIN_LENGTH);
        if (NULL == pSD)
        {
            _tprintf(_T("LocalAlloc Error %u\n"), GetLastError());
            goto Cleanup;
        }
    
        if (!InitializeSecurityDescriptor(pSD,
            SECURITY_DESCRIPTOR_REVISION))
        {
            _tprintf(_T("InitializeSecurityDescriptor Error %u\n"),
                GetLastError());
            goto Cleanup;
        }
    
        // Add the ACL to the security descriptor. 
        if (!SetSecurityDescriptorDacl(pSD,
            TRUE,     // bDaclPresent flag   
            pACL,
            FALSE))   // not a default DACL 
        {
            _tprintf(_T("SetSecurityDescriptorDacl Error %u\n"),
                GetLastError());
            goto Cleanup;
        }
    
        // Initialize a security attributes structure.
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);
        sa.lpSecurityDescriptor = pSD;
        sa.bInheritHandle = FALSE;
    
    
        // Use the security attributes to set the security descriptor 
        // when you create a key.
        lRes = RegCreateKeyEx(HKEY_CURRENT_USER, _T("mykey"), 0, cls, 0,
            KEY_READ | KEY_WRITE, &sa, &hkSub, &dwDisposition);
        _tprintf(_T("RegCreateKeyEx result %u\n"), lRes);
    
    Cleanup:
    
        if (pEveryoneSID)
            FreeSid(pEveryoneSID);
        if (pAdminSID)
            FreeSid(pAdminSID);
        if (pACL)
            LocalFree(pACL);
        if (pSD)
            LocalFree(pSD);
        if (hkSub)
            RegCloseKey(hkSub);
    
        return;
    
    }
    

      

  • 相关阅读:
    mysql性能优化学习笔记(1)优化目的、方向及数据库准备
    php笔试算法题:顺时针打印矩阵坐标蛇形算法
    离职了,一切从头开始
    mysql性能优化学习笔记(2)如何发现有问题的sql
    WTL的使用
    获取程序当前目录的绝对路径
    [读书笔记]《C#本质论》读书笔记
    [.NET]ConcurrentDictionary 线程安全的集合类
    RakNet中文手册
    Python SCons
  • 原文地址:https://www.cnblogs.com/chunyou128/p/16001675.html
Copyright © 2020-2023  润新知