如何使用 boost 文件系统确定文件或目录的所有者? [复制]

2024-03-18

可能的重复:
使用 boost 获取文件的所有者和组 https://stackoverflow.com/questions/10289491/get-files-owner-and-group-using-boost

我想使用 boost::filesystem 来确定特定用户拥有哪些文件和目录/文件夹。

我需要在 Linux (ext3) 和 Windows (NTFS) 文件系统上执行此操作。

如何使用 boost::filesystem 获取指定路径的用户标识符?

提前致谢。

编辑:从所选答案派生的代码:

#include <iostream>
#include <string>

#ifdef LINUX
#include <pwd.h>
#include <grp.h>
#include <sys/stat.h>
#else
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include "accctrl.h"
#include "aclapi.h"
#pragma comment(lib, "advapi32.lib")
#endif

bool getOwner(const std::string &Filename, std::string &Owner)
{
#ifdef LINUX
    struct stat FileInfo;
    stat(Filename.c_str(), &FileInfo);
    struct passwd *UserDatabaseEntry  = getpwuid(FileInfo.st_uid);
    struct group  *GroupDatabaseEntry = getgrgid(FileInfo.st_gid);
    //
    if (UserDatabaseEntry != 0)
    {
        Owner = UserDatabaseEntry->pw_name;
        return true;
    }
    else
    {
        return false;
    }
#else
    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(Filename.c_str()),
        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 false;
    }

    // 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 false;
    }

    // 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 false;
    }

    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 false;

    }

    // 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 false;

    }
    else if (bRtnBool == TRUE)
    {

        // Print the account name.
        _tprintf(TEXT("Account owner = %s\n"), AcctName);
        Owner = AcctName;
        return true;
    }
#endif
    return false;
}

int main(int argc, char *argv[])
{
    std::string Filename = argv[0];
    if (argc > 1)
    {
        Filename = argv[1];
    }
    std::cout << "File " << Filename << " is owned by: ";
    //
    std::string Owner;
    bool OK = getOwner(Filename, Owner);
    if (OK)
    {
        std::cout << Owner << "." << std::endl;
    }
    else
    {
        std::cout << "Unknown." << std::endl;
    }
    return 0;
}

恐怕 boost::filesystem 库没有涵盖您想要实现的目标。是可以找回的文件权限 http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/reference.html#Enum-perms,但是对于所有权,您将不得不求助于其他东西或编写自己的东西。

这是如何做到这一点的解释Windows http://msdn.microsoft.com/en-us/library/windows/desktop/aa446629%28v=vs.85%29.aspx and Linux https://stackoverflow.com/questions/7328327/how-to-get-files-owner-name-in-linux-using-c.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 boost 文件系统确定文件或目录的所有者? [复制] 的相关文章

随机推荐

  • 在 R 中按组引导结果向量

    Question 如何使用引导程序来获取一组数据的置信区间 根据协方差矩阵的特征值计算的统计数据 分别为 数据框中的每个组 因子水平 Problem 数据不太清楚 结构我需要包含这些适合的结果boot函数 或者一种在组上 映射 引导程序并以
  • 如何验证 DataGridView 输入?

    我有一些严重的问题数据网格视图输入验证 我正在使用实体框架开发一个项目 并且我已经绑定了数据网格视图元素到数据库 如果用户将一些数据插入到不可为空的列中 然后清除数据以使该列留空 然后单击另一个数据网格视图单元格时 发生异常并且出现运行时错
  • 使用 Python/Pandas 对非系统/排列数据进行平均和绘制

    我有一个非系统 整理的数据如下 x y 0 049098 82854 2105263158 0 049058 82472 2368421053 0 066427 84358 3421052632 0 066465 83842 9210526
  • WPF:禁用选项卡控件上的箭头键

    我在应用程序中使用 WPF TabControl 以便在程序的不同区域 功能之间切换 不过有一件事让我很恼火 我隐藏了选项卡 这样我就可以控制选定的选项卡 而不是用户 然而 用户仍然可以使用箭头键在选项卡之间切换 我尝试过使用 Keyboa
  • 如何列出 FastAPI 中所有定义的 URL 路径?

    假设我有一个包含 100 多个 API 端点的 FastAPI 项目 如何列出所有 API 路径 为了获取所有可能的 URL 模式 我们需要访问定义的 URL 路由这是正在运行的应用程序实例的一个属性 我们至少可以通过两种方式做到这一点 U
  • 你的 Nvarchar() 有多大

    设计数据库时 在决定 nvarchar 应该有多大时 您会考虑哪些决定 如果我要制作一个地址表 我的直觉反应是地址行 1 为 nvarchar 255 就像旧的访问数据库一样 我发现使用这个让我对旧的 字符串将被截断 感到烦恼 我知道可以通
  • 在 C# 中返回 SortedList 中的第一个元素

    我有一个SortedList在 C 中 我想返回列表的第一个元素 我尝试使用 First 功能 但它并没有真正起作用 有人可以告诉我该怎么做吗 对彼此而言SortedList https learn microsoft com en us
  • angularjs 禁用 $http/$q 调用上的按钮

    遵循 DRY 原则 我想编写一个按钮指令 在 http 类的持续时间内保持按钮禁用 我想这样做是为了禁止用户多次单击按钮 但我无法考虑如何在指令内获取函数承诺状态 因为该函数驻留在 scope 上 这个场景非常通用 按钮 ng click
  • WebDriverWait + 搜索项目

    创建激活码后 需要 1 60 秒的时间将代码上传到系统中 因此 在创建新代码后 我想使用 WebDriverWait 60 秒来确保在这段时间内每 3 秒我想单击 搜索 按钮 有什么办法可以做到这一点吗 new WebDriverWait
  • 安全、密码学:愚蠢的挑战 - 响应协议?

    好吧 大家只是一个小游戏 我有一个项目的一些规格 在某些时候 他们要求以下内容通过网络加密密码 并称这是一个质询响应协议 CLIENT SERVER 1 ask for challenge gt 2 lt send SHA1 taken f
  • Safari 错误未定义不是对象

    我在这里阅读了一些关于我的问题的帖子 但我不知道如何将其应用到我的代码中 因为我不使用数组或其他对象 在 Safari 中我收到此错误 TypeError undefined is not an object evaluating rela
  • 是否可以使用 WIX 创建多语言安装程序?

    是否可以使用 WIX 创建多语言安装程序 如果您创建嵌入式转换 则无需引导程序即可执行此操作 并且 MSI 安装程序将根据您的系统区域设置自动应用其中之一 有关完整的详细信息和脚本 请点击以下链接 http www geektieguy c
  • 无法将“%26”传递到 WCF 服务中的 WebGet UriTemplate 变量?

    我有一个带有此声明操作的 WCF 服务 WebGet UriTemplate Test testString public String Test String testString return testString 但是当尝试调用 UR
  • 了解filterM

    Consider filterM x gt True False 1 2 3 我只是无法理解 Haskell 对此的魔力filterM用例 该函数的源码如下 filterM Monad m gt a gt m Bool gt a gt m
  • 从 Java 中的组合框中删除所有项目

    我需要从组合框中删除所有项目 int itemCount combo getItemCount for int i 0 i lt itemCount i combo removeItemAt 0 此代码将删除除最后一项之外的所有项目 它给出
  • 枚举还是表格?

    我正在将其设为社区维基 因为我会欣赏人们的方法 而不一定是答案 我所处的情况是 我有很多查找类型数据字段 这些字段不会改变 一个例子是 年薪选项 0 25K选项 25K 100K选项 100K 我希望通过枚举轻松获得这些选项 但也希望数据库
  • Django-Postgres 完整性错误:重复密钥 --- 如何修复?

    添加模型的新实例时出现完整性错误 这是回溯 Traceback File home robain webapps django lib python2 6 django core handlers base py in get respon
  • 如何迭代 SortedSet 以修改其中的项目

    假设我有一个列表 在for循环中修改列表的项目没有问题 for int i 0 i lt list size i list get i setId i 但我有一个 SortedSet 而不是列表 我怎样才能用它做同样的事情 谢谢 首先 Se
  • 无需插值即可缩小/调整图像大小

    我有一个图像F大小为 1044 1408 只有 3 个整数值 0 2 3 我想把它缩小到360 480 现在我正在使用Z cv2 resize F 480 380 But Z是插值的 它有许多唯一值 不仅仅是 0 2 和 3 我不能将插值值
  • 如何使用 boost 文件系统确定文件或目录的所有者? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 boost 获取文件的所有者和组 https stackoverflow com questions 10289491 get files owner and group using boost