1 |
douglas |
449 |
// Douglas Thrift |
2 |
|
|
// |
3 |
|
|
// Samba Permissionify |
4 |
|
|
// |
5 |
|
|
// $Id$ |
6 |
|
|
|
7 |
|
|
#include <iostream> |
8 |
|
|
#include <string> |
9 |
|
|
|
10 |
|
|
#include <aclapi.h> |
11 |
|
|
#include <sddl.h> |
12 |
|
|
|
13 |
|
|
int main(int argc, char* argv[]) |
14 |
|
|
{ |
15 |
|
|
std::wstring file(L"\\\\daemon\\douglas\\Music\\Sugarcult\\Five\\05 Bruises.wma"); |
16 |
|
|
PSID owner, group; |
17 |
|
|
PSECURITY_DESCRIPTOR descriptor; |
18 |
|
|
|
19 |
|
|
if (unsigned long code = GetNamedSecurityInfo(const_cast<LPTSTR>(file.c_str()), SE_FILE_OBJECT, GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, &owner, &group, NULL, NULL, &descriptor) != ERROR_SUCCESS) |
20 |
|
|
{ |
21 |
|
|
std::cout << code << std::endl; |
22 |
|
|
|
23 |
|
|
return 1; |
24 |
|
|
} |
25 |
|
|
|
26 |
|
|
unsigned long sizeName(32), sizeDomain(32); |
27 |
|
|
std::wstring ownerName(sizeName, L'\0'), ownerDomain(sizeDomain, L'\0'); |
28 |
|
|
SID_NAME_USE ownerType; |
29 |
|
|
|
30 |
|
|
if (!LookupAccountSid(const_cast<LPWSTR>(file.substr(2, 6).data()), owner, const_cast<LPWSTR>(ownerName.data()), &sizeName, const_cast<LPWSTR>(ownerDomain.data()), &sizeDomain, &ownerType)) |
31 |
|
|
{ |
32 |
|
|
std::cout << GetLastError() << std::endl; |
33 |
|
|
|
34 |
|
|
return 1; |
35 |
|
|
} |
36 |
|
|
|
37 |
|
|
ownerName.resize(sizeName); |
38 |
|
|
ownerDomain.resize(sizeDomain); |
39 |
|
|
|
40 |
|
|
wchar_t* ownerPermission; |
41 |
|
|
|
42 |
|
|
if (!ConvertSecurityDescriptorToStringSecurityDescriptor(descriptor, SDDL_REVISION_1, OWNER_SECURITY_INFORMATION, &ownerPermission, NULL)) |
43 |
|
|
{ |
44 |
|
|
std::cout << GetLastError() << std::endl; |
45 |
|
|
|
46 |
|
|
return 1; |
47 |
|
|
} |
48 |
|
|
|
49 |
|
|
std::wcout << ownerDomain << '\\' << ownerName << ' ' << ownerPermission << std::endl; |
50 |
|
|
|
51 |
|
|
LocalFree(ownerPermission); |
52 |
|
|
|
53 |
|
|
sizeName = 32; |
54 |
|
|
sizeDomain = 32; |
55 |
|
|
|
56 |
|
|
std::wstring groupName(sizeName, L'\0'), groupDomain(sizeDomain, L'\0'); |
57 |
|
|
SID_NAME_USE groupType; |
58 |
|
|
|
59 |
|
|
if (!LookupAccountSid(const_cast<LPWSTR>(file.substr(2, 6).data()), group, const_cast<LPWSTR>(groupName.data()), &sizeName, const_cast<LPWSTR>(groupDomain.data()), &sizeDomain, &groupType)) |
60 |
|
|
{ |
61 |
|
|
std::cout << GetLastError() << std::endl; |
62 |
|
|
|
63 |
|
|
return 1; |
64 |
|
|
} |
65 |
|
|
|
66 |
|
|
groupName.resize(sizeName); |
67 |
|
|
groupDomain.resize(sizeDomain); |
68 |
|
|
|
69 |
|
|
std::wcout << groupDomain << '\\' << groupName << std::endl; |
70 |
|
|
|
71 |
|
|
LocalFree(descriptor); |
72 |
|
|
|
73 |
|
|
return 0; |
74 |
|
|
} |