程序使用C编程中的Win32 API获取所有本地用户及其对给定文件的许可

玛姬

我正在尝试获取给定文件的所有用户详细信息和用户特权。像这样的输出

我应该如何使用C编程中win32 api提供的GetSecurityInfo()打印此内容?我现在可以使用以下代码来获得文件所有者:

#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include "accctrl.h"
#include "aclapi.h"
#pragma comment(lib, "advapi32.lib")

int main(void)
{
DWORD dwRtnCode = 0;
PSID pSidOwner = NULL;
BOOL bRtnBool = TRUE;
LPTSTR AcctName = NULL;
LPTSTR DomainName = NULL;
DWORD dwAcctName = 1, dwDomainName = 1;
SID_NAME_USE eUse = SidTypeUnknown;
HANDLE hFile;
PSECURITY_DESCRIPTOR pSD = NULL;

// Get the handle of the file object.
hFile = CreateFile(
                  TEXT("C:/Users/Vicky/Documents/Software/abc.txt"),
                  GENERIC_READ,
                  FILE_SHARE_READ,
                  NULL,
                  OPEN_EXISTING,
                  FILE_ATTRIBUTE_NORMAL,
                  NULL);
                  
// Check GetLastError for CreateFile error code.
if (hFile == INVALID_HANDLE_VALUE) {
          DWORD dwErrorCode = 0;
          dwErrorCode = GetLastError();
          _tprintf(TEXT("CreateFile error = %d\n"), dwErrorCode);
          return -1;
}

// Get the owner SID of the file.
dwRtnCode = GetSecurityInfo(
                  hFile,
                  SE_FILE_OBJECT,
                  OWNER_SECURITY_INFORMATION,
                  &pSidOwner,
                  NULL,
                  NULL,
                  NULL,
                  &pSD);

// Check GetLastError for GetSecurityInfo error condition.
if (dwRtnCode != ERROR_SUCCESS) {
          DWORD dwErrorCode = 0;
          dwErrorCode = GetLastError();
          _tprintf(TEXT("GetSecurityInfo error = %d\n"), dwErrorCode);
          return -1;
}

// First call to LookupAccountSid to get the buffer sizes.
bRtnBool = LookupAccountSid(
                  NULL,           // local computer
                  pSidOwner,
                  AcctName,
                  (LPDWORD)&dwAcctName,
                  DomainName,
                  (LPDWORD)&dwDomainName,
                  &eUse);

// Reallocate memory for the buffers.
AcctName = (LPTSTR)GlobalAlloc(
          GMEM_FIXED,
          dwAcctName);

// Check GetLastError for GlobalAlloc error condition.
if (AcctName == NULL) {
          DWORD dwErrorCode = 0;
          dwErrorCode = GetLastError();
          _tprintf(TEXT("GlobalAlloc error = %d\n"), dwErrorCode);
          return -1;
}

    DomainName = (LPTSTR)GlobalAlloc(
           GMEM_FIXED,
           dwDomainName);

    // Check GetLastError for GlobalAlloc error condition.
    if (DomainName == NULL) {
          DWORD dwErrorCode = 0;
          dwErrorCode = GetLastError();
          _tprintf(TEXT("GlobalAlloc error = %d\n"), dwErrorCode);
          return -1;

    }

    // Second call to LookupAccountSid to get the account name.
    bRtnBool = LookupAccountSid(
          NULL,                   // name of local or remote computer
          pSidOwner,              // security identifier
          AcctName,               // account name buffer
          (LPDWORD)&dwAcctName,   // size of account name buffer 
          DomainName,             // domain name
          (LPDWORD)&dwDomainName, // size of domain name buffer
          &eUse);                 // SID type

    // Check GetLastError for LookupAccountSid error condition.
    if (bRtnBool == FALSE) {
          DWORD dwErrorCode = 0;
          dwErrorCode = GetLastError();

          if (dwErrorCode == ERROR_NONE_MAPPED)
              _tprintf(TEXT
                  ("Account owner not found for specified SID.\n"));
          else 
              _tprintf(TEXT("Error in LookupAccountSid.\n"));
          return -1;

    } else if (bRtnBool == TRUE) 

        // Print the account name.
        _tprintf(TEXT("Account owner = %s\n"), AcctName);

    return 0;
}
Rita Han-MSFT

如果要获取文件的权限条目,如下快照所示:

在此处输入图片说明

您可以参考以下示例:

// Get the DACL of the file.
PACL pDACL;
dwRtnCode = GetSecurityInfo(hFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pDACL, NULL, NULL);
if (dwRtnCode != ERROR_SUCCESS)
{
    return dwRtnCode;
}
PACL pAcl = pDACL;
int aceNum = pDACL->AceCount;
for (int i = 0; i < aceNum; i++)
{
    ACE_HEADER *aceAddr = NULL;
    if (GetAce(pAcl, i, (void**)(&aceAddr)))
    {
        if (ACCESS_ALLOWED_ACE_TYPE == aceAddr->AceType)
        {
            printf("ACE type: Allow, "); 

            ACCESS_MASK access = ((ACCESS_ALLOWED_ACE *)aceAddr)->Mask;

            // Get size of SID
            DWORD size = ((ACCESS_ALLOWED_ACE *)aceAddr)->Header.AceSize - sizeof(ACE_HEADER) - sizeof(ACCESS_MASK);
            if (!size)
                return FALSE;

            BYTE *tempAddr = (BYTE *)aceAddr;

            //Find SID start address
            tempAddr += sizeof(ACE_HEADER) + sizeof(ACCESS_MASK);

            BYTE * pSid = (BYTE *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size);
            RtlCopyMemory(pSid, tempAddr, size);

            // First call to LookupAccountSid to get the buffer sizes.
            bRtnBool = LookupAccountSid(
                NULL,           
                pSid,
                AcctName,
                (LPDWORD)&dwAcctName,
                DomainName,
                (LPDWORD)&dwDomainName,
                &eUse);

            // Reallocate memory for the buffers.
            AcctName = (LPTSTR)GlobalAlloc(
                GMEM_FIXED,
                dwAcctName);

            // Check GetLastError for GlobalAlloc error condition.
            if (AcctName == NULL) {
                DWORD dwErrorCode = 0;
                dwErrorCode = GetLastError();
                _tprintf(TEXT("GlobalAlloc error = %d\n"), dwErrorCode);
                return -1;
            }

            DomainName = (LPTSTR)GlobalAlloc(
                GMEM_FIXED,
                dwDomainName);

            // Check GetLastError for GlobalAlloc error condition.
            if (DomainName == NULL) {
                DWORD dwErrorCode = 0;
                dwErrorCode = GetLastError();
                _tprintf(TEXT("GlobalAlloc error = %d\n"), dwErrorCode);
                return -1;

            }

            // Second call to LookupAccountSid to get the account name.
            bRtnBool = LookupAccountSid(
                NULL,                   // name of local or remote computer
                pSid,              // security identifier
                AcctName,               // account name buffer
                (LPDWORD)&dwAcctName,   // size of account name buffer 
                DomainName,             // domain name
                (LPDWORD)&dwDomainName, // size of domain name buffer
                &eUse);                 // SID type

            // Check GetLastError for LookupAccountSid error condition.
            if (bRtnBool == FALSE) {
                DWORD dwErrorCode = 0;
                dwErrorCode = GetLastError();

                if (dwErrorCode == ERROR_NONE_MAPPED)
                    _tprintf(TEXT
                    ("Account owner not found for specified SID.\n"));
                else
                    _tprintf(TEXT("Error in LookupAccountSid.\n"));
                return -1;

            }
            else if (bRtnBool == TRUE)
            {
                // Print the account name.
                _tprintf(TEXT("Account name = %s, "), AcctName);
            }

            //HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, pSid);

            // Check access permissions
            printf("Access: ");
            if (access & SYNCHRONIZE)
                printf("SYNCHRONIZE/ ");

            if(access & READ_CONTROL)
                printf("READ_CONTROL \n");
        }
    }
}

结果示例:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用ObjectQuery获取本地用户的所有组?

来自分类Dev

使用Win32 C ++和钩子从应用程序中的按钮获取文本

来自分类Dev

如何获取Win32 C ++应用程序中单选按钮的状态?

来自分类Dev

使用Win32 Api在C程序中进行串行连接

来自分类Dev

C ++如何使用Win32 API通过线程从文本框中获取文本

来自分类Dev

在C ++中使用Win32 Api在任务栏中设置NOTIFY ICON

来自分类Dev

WDF桌面应用程序带有MDF,所有本地用户都在本地使用

来自分类Dev

使用C ++ Win32 API启用视觉样式吗?

来自分类Dev

Win32 API InterlockedIncrement在多线程编程中的意外结果

来自分类Dev

在哪里可以找到Win32 API中ManagementObjectSearcher中使用的所有表

来自分类Dev

使用Win32 C ++复制CD Rom中的所有文件并将其保存在其他位置的文件夹中

来自分类Dev

VS 2010中Win32应用程序中的文件夹复制

来自分类Dev

VS 2010中Win32应用程序中的文件夹复制

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

JNI C ++ DLL-'UnsatisfiedLinkError:%1不是有效的Win32应用程序'

来自分类Dev

Rails 3.2.1:%1不是有效的Win32应用程序。-c:/ RailsInstaller

来自分类Dev

在Win32程序中使用XAML Hosting API导航到页面会导致访问冲突

来自分类Dev

Masm程序不起作用。(使用Win32 API-CreateFile)

来自分类Dev

DLL加载失败-不是有效的Win32应用程序-使用NumPy

来自分类Dev

Win32应用程序具有高CPU使用率

来自分类Dev

DLL加载失败-不是有效的Win32应用程序-使用NumPy

来自分类Dev

如何使用Win32 API从INI文件中删除部分?

来自分类Dev

OSError:[WinError 193]%1不是有效的Win32应用程序,同时使用CTypes读取python中的custim DLL

来自分类Dev

Win32程序集有条件跳转

来自分类Dev

检查是否正在使用Win32 API或C / C ++写入文件。我本人没有写权限

来自分类Dev

C ++ Win32如何将此功能放在单独的cpp文件中?

来自分类Dev

在C ++ Win32项目的最终exe文件中未显示图像(PNG)

来自分类Dev

C ++ Win32 Api资源文件

Related 相关文章

  1. 1

    如何使用ObjectQuery获取本地用户的所有组?

  2. 2

    使用Win32 C ++和钩子从应用程序中的按钮获取文本

  3. 3

    如何获取Win32 C ++应用程序中单选按钮的状态?

  4. 4

    使用Win32 Api在C程序中进行串行连接

  5. 5

    C ++如何使用Win32 API通过线程从文本框中获取文本

  6. 6

    在C ++中使用Win32 Api在任务栏中设置NOTIFY ICON

  7. 7

    WDF桌面应用程序带有MDF,所有本地用户都在本地使用

  8. 8

    使用C ++ Win32 API启用视觉样式吗?

  9. 9

    Win32 API InterlockedIncrement在多线程编程中的意外结果

  10. 10

    在哪里可以找到Win32 API中ManagementObjectSearcher中使用的所有表

  11. 11

    使用Win32 C ++复制CD Rom中的所有文件并将其保存在其他位置的文件夹中

  12. 12

    VS 2010中Win32应用程序中的文件夹复制

  13. 13

    VS 2010中Win32应用程序中的文件夹复制

  14. 14

    GetGuiResources WIn32 API使用

  15. 15

    GetGuiResources WIn32 API使用

  16. 16

    JNI C ++ DLL-'UnsatisfiedLinkError:%1不是有效的Win32应用程序'

  17. 17

    Rails 3.2.1:%1不是有效的Win32应用程序。-c:/ RailsInstaller

  18. 18

    在Win32程序中使用XAML Hosting API导航到页面会导致访问冲突

  19. 19

    Masm程序不起作用。(使用Win32 API-CreateFile)

  20. 20

    DLL加载失败-不是有效的Win32应用程序-使用NumPy

  21. 21

    Win32应用程序具有高CPU使用率

  22. 22

    DLL加载失败-不是有效的Win32应用程序-使用NumPy

  23. 23

    如何使用Win32 API从INI文件中删除部分?

  24. 24

    OSError:[WinError 193]%1不是有效的Win32应用程序,同时使用CTypes读取python中的custim DLL

  25. 25

    Win32程序集有条件跳转

  26. 26

    检查是否正在使用Win32 API或C / C ++写入文件。我本人没有写权限

  27. 27

    C ++ Win32如何将此功能放在单独的cpp文件中?

  28. 28

    在C ++ Win32项目的最终exe文件中未显示图像(PNG)

  29. 29

    C ++ Win32 Api资源文件

热门标签

归档