fsptool: getuid, getgid

This commit is contained in:
Bill Zissimopoulos 2017-07-19 16:05:49 -07:00
parent fcae6ce018
commit 6b2dcaef96

View File

@ -58,7 +58,6 @@ static void usage(void)
" lsvol list file system devices (volumes)\n" " lsvol list file system devices (volumes)\n"
//" list list running file system processes\n" //" list list running file system processes\n"
//" kill kill file system process\n" //" kill kill file system process\n"
" getsid get current SID\n"
" getuid get current POSIX UID\n" " getuid get current POSIX UID\n"
" getgid get current POSIX GID\n" " getgid get current POSIX GID\n"
" uidtosid get SID from POSIX UID\n" " uidtosid get SID from POSIX UID\n"
@ -129,6 +128,102 @@ static WCHAR FspToolGetDriveLetter(PDWORD PLogicalDrives, PWSTR VolumeName)
return 0; return 0;
} }
NTSTATUS FspToolGetUid(HANDLE Token, PUINT32 PUid)
{
UINT32 Uid;
union
{
TOKEN_USER V;
UINT8 B[128];
} UserInfoBuf;
PTOKEN_USER UserInfo = &UserInfoBuf.V;
DWORD Size;
NTSTATUS Result;
if (!GetTokenInformation(Token, TokenUser, UserInfo, sizeof UserInfoBuf, &Size))
{
if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
{
Result = FspNtStatusFromWin32(GetLastError());
goto exit;
}
UserInfo = MemAlloc(Size);
if (0 == UserInfo)
{
Result = STATUS_INSUFFICIENT_RESOURCES;
goto exit;
}
if (!GetTokenInformation(Token, TokenUser, UserInfo, Size, &Size))
{
Result = FspNtStatusFromWin32(GetLastError());
goto exit;
}
}
Result = FspPosixMapSidToUid(UserInfo->User.Sid, &Uid);
if (!NT_SUCCESS(Result))
goto exit;
*PUid = Uid;
Result = STATUS_SUCCESS;
exit:
if (UserInfo != &UserInfoBuf.V)
MemFree(UserInfo);
return Result;
}
NTSTATUS FspToolGetGid(HANDLE Token, PUINT32 PGid)
{
UINT32 Gid;
union
{
TOKEN_PRIMARY_GROUP V;
UINT8 B[128];
} GroupInfoBuf;
PTOKEN_PRIMARY_GROUP GroupInfo = &GroupInfoBuf.V;
DWORD Size;
NTSTATUS Result;
if (!GetTokenInformation(Token, TokenPrimaryGroup, GroupInfo, sizeof GroupInfoBuf, &Size))
{
if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
{
Result = FspNtStatusFromWin32(GetLastError());
goto exit;
}
GroupInfo = MemAlloc(Size);
if (0 == GroupInfo)
{
Result = STATUS_INSUFFICIENT_RESOURCES;
goto exit;
}
if (!GetTokenInformation(Token, TokenPrimaryGroup, GroupInfo, Size, &Size))
{
Result = FspNtStatusFromWin32(GetLastError());
goto exit;
}
}
Result = FspPosixMapSidToUid(GroupInfo->PrimaryGroup, &Gid);
if (!NT_SUCCESS(Result))
goto exit;
*PGid = Gid;
Result = STATUS_SUCCESS;
exit:
if (GroupInfo != &GroupInfoBuf.V)
MemFree(GroupInfo);
return Result;
}
static NTSTATUS lsvol_dev(PWSTR DeviceName) static NTSTATUS lsvol_dev(PWSTR DeviceName)
{ {
NTSTATUS Result; NTSTATUS Result;
@ -147,7 +242,6 @@ static NTSTATUS lsvol_dev(PWSTR DeviceName)
if (L'\0' == *P) if (L'\0' == *P)
{ {
Drive[0] = FspToolGetDriveLetter(&LogicalDrives, VolumeName); Drive[0] = FspToolGetDriveLetter(&LogicalDrives, VolumeName);
info("%-4S%S", Drive[0] ? Drive : L"", VolumeName); info("%-4S%S", Drive[0] ? Drive : L"", VolumeName);
VolumeName = P + 1; VolumeName = P + 1;
} }
@ -175,19 +269,50 @@ static int lsvol(int argc, wchar_t **argv)
return 0; return 0;
} }
static int getsid(int argc, wchar_t **argv)
{
return 1;
}
static int getuid(int argc, wchar_t **argv) static int getuid(int argc, wchar_t **argv)
{ {
return 1; if (1 != argc)
usage();
HANDLE Token;
UINT32 Uid;
NTSTATUS Result;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token))
return GetLastError();
Result = FspToolGetUid(Token, &Uid);
if (!NT_SUCCESS(Result))
return FspWin32FromNtStatus(Result);
CloseHandle(Token);
info("%u", Uid);
return 0;
} }
static int getgid(int argc, wchar_t **argv) static int getgid(int argc, wchar_t **argv)
{ {
return 1; if (1 != argc)
usage();
HANDLE Token;
UINT32 Gid;
NTSTATUS Result;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &Token))
return GetLastError();
Result = FspToolGetGid(Token, &Gid);
if (!NT_SUCCESS(Result))
return FspWin32FromNtStatus(Result);
CloseHandle(Token);
info("%u", Gid);
return 0;
} }
static int uidtosid(int argc, wchar_t **argv) static int uidtosid(int argc, wchar_t **argv)
@ -221,9 +346,6 @@ int wmain(int argc, wchar_t **argv)
if (0 == invariant_wcscmp(L"lsvol", argv[0])) if (0 == invariant_wcscmp(L"lsvol", argv[0]))
return lsvol(argc, argv); return lsvol(argc, argv);
else else
if (0 == invariant_wcscmp(L"getsid", argv[0]))
return getsid(argc, argv);
else
if (0 == invariant_wcscmp(L"getuid", argv[0])) if (0 == invariant_wcscmp(L"getuid", argv[0]))
return getuid(argc, argv); return getuid(argc, argv);
else else