Como posso determinar o proprietário de um arquivo ou diretório com impulso sistema de arquivos?[duplicado]

StackOverflow https://stackoverflow.com//questions/10681929

Pergunta

Possíveis Duplicados:
Obter o ficheiro de proprietário e de grupo usando o boost

Eu gostaria de usar o boost::sistema de arquivos para determinar quais arquivos e diretórios/ pastas são de propriedade de um determinado usuário.

Eu preciso fazer isso no Linux (ext3) e o Windows (NTFS) de sistemas de arquivos.

Como posso obter o identificador de usuário para um caminho especificado usando o boost::sistema de arquivos?

Obrigado antecipadamente.

Editar:Código derivada da resposta selecionada:

#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;
}
Foi útil?

Solução

Eu tenho medo de que você está tentando alcançar não está coberto pelo boost::sistema de ficheiros de biblioteca.É possível recuperar permissões de arquivo, mas , para a propriedade, você teria de recorrer a algo ou escrever a sua própria.

Aqui está uma explicação de como fazê-lo para Windows e Linux.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top