fsptool: id

This commit is contained in:
Bill Zissimopoulos 2017-07-20 05:29:13 +01:00
parent 3f90d60dc4
commit c7a779fa98

View File

@ -204,6 +204,37 @@ NTSTATUS FspToolGetNameFromSid(PSID Sid, PWSTR *PName)
return STATUS_SUCCESS;
}
NTSTATUS FspToolGetSidFromName(PWSTR Name, PSID *PSid)
{
PSID Sid;
WCHAR Domn[256];
DWORD SidSize, DomnSize;
SID_NAME_USE Use;
SidSize = 0;
DomnSize = sizeof Domn / sizeof Domn[0];
if (LookupAccountNameW(0, Name, 0, &SidSize, Domn, &DomnSize, &Use))
return STATUS_INVALID_PARAMETER;
if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
return FspNtStatusFromWin32(GetLastError());
Sid = MemAlloc(SidSize);
if (0 == Sid)
return STATUS_INSUFFICIENT_RESOURCES;
DomnSize = sizeof Domn / sizeof Domn[0];
if (!LookupAccountNameW(0, Name, Sid, &SidSize, Domn, &DomnSize, &Use))
{
MemFree(Sid);
return FspNtStatusFromWin32(GetLastError());
}
*PSid = Sid;
return STATUS_SUCCESS;
}
static NTSTATUS lsvol_dev(PWSTR DeviceName)
{
NTSTATUS Result;
@ -283,17 +314,60 @@ exit:
static NTSTATUS id_name(PWSTR Name)
{
PSID Sid = 0;
NTSTATUS Result;
Result = FspToolGetSidFromName(Name, &Sid);
if (!NT_SUCCESS(Result))
return Result;
id_print_sid("%S(%S) (uid=%u)", Sid);
MemFree(Sid);
return STATUS_SUCCESS;
}
static NTSTATUS id_sid(PWSTR SidStr)
{
PSID Sid = 0;
if (!ConvertStringSidToSid(SidStr, &Sid))
return FspNtStatusFromWin32(GetLastError());
id_print_sid("%S(%S) (uid=%u)", Sid);
LocalFree(Sid);
return STATUS_SUCCESS;
}
static NTSTATUS id_uid(PWSTR UidStr)
{
PSID Sid = 0;
UINT32 Uid;
NTSTATUS Result;
Uid = 0;
for (PWSTR P = UidStr; *P; P++)
{
int C = *P;
if ('0' <= C && C <= '9')
Uid = 10 * Uid + (C - '0');
else
return STATUS_INVALID_PARAMETER;
}
static NTSTATUS id_sid(PWSTR Name)
{
return STATUS_INVALID_PARAMETER;
}
Result = FspPosixMapUidToSid(Uid, &Sid);
if (!NT_SUCCESS(Result))
return Result;
static NTSTATUS id_uid(PWSTR Name)
{
return STATUS_INVALID_PARAMETER;
id_print_sid("%S(%S) (uid=%u)", Sid);
FspDeleteSid(Sid, FspPosixMapUidToSid);
return STATUS_SUCCESS;
}
static NTSTATUS id_user(void)
@ -348,18 +422,14 @@ static int id(int argc, wchar_t **argv)
if (2 == argc)
{
PWSTR P;
for (P = argv[1]; *P; P++)
if (L'\\' == *P)
break;
if (L'\\' == *P)
Result = id_name(argv[1]);
else if (L'S' == argv[1][0] || L's' == argv[1][0])
if (L'S' == argv[1][0] && L'-' == argv[1][1] && L'1' == argv[1][2] && L'-' == argv[1][3])
Result = id_sid(argv[1]);
else
{
Result = id_uid(argv[1]);
if (STATUS_INVALID_PARAMETER == Result)
Result = id_name(argv[1]);
}
}
else
Result = id_user();