一部のC APIにC++ラッパーを作成しています。
#include <string>
#include <vector>
#define STRICT
#define NOMINMAX
#include <Windows.h>
std::vector<BYTE> GetFileSecurityW(std::wstring_view Path, SECURITY_INFORMATION RequestedInformation)
{
DWORD needed{ 0 };
if (!::GetFileSecurityW(Path.data(), RequestedInformation, nullptr, 0, &needed)
&& ::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
return {};
}
std::vector<BYTE> buffer(needed);
if (!::GetFileSecurityW(Path.data(), RequestedInformation,
static_cast<PSECURITY_DESCRIPTOR>(buffer.data()), needed, &needed))
{
return {};
}
return std::move(buffer);
}
std::tuple<std::wstring, std::wstring, SID_NAME_USE> LookupAccountSidW(
std::wstring_view SystemName,
PSID Sid)
{
DWORD cchName{ 0 };
DWORD cchRefDomainName{ 0 };
SID_NAME_USE use;
if (!::LookupAccountSidW(nullptr, Sid, 0,
&cchName, nullptr, &cchRefDomainName, &use)
&& ::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
{
return {};
}
std::wstring name(cchName, L'\0');
std::wstring refDomainName(cchRefDomainName, L'\0');
if (!::LookupAccountSidW(nullptr, Sid,
name.data(), &cchName, refDomainName.data(), &cchRefDomainName, &use))
{
return {};
}
return std::make_tuple(std::move(name), std::move(refDomainName), use);
}
int main()
{
std::wstring_view path{ L"C:\\Windows" };
auto secDescBuffer = GetFileSecurityW(path, OWNER_SECURITY_INFORMATION);
auto pSecDesc = static_cast<PSECURITY_DESCRIPTOR>(secDescBuffer.data());
PSID psidOwner;
BOOL ownerDefaulted;
if (!::GetSecurityDescriptorOwner(pSecDesc, &psidOwner, &ownerDefaulted))
{
return 0;
}
auto [name, refDomainName, use] = LookupAccountSidW({}, psidOwner);
return 0;
}