379 lines
7.7 KiB
C
379 lines
7.7 KiB
C
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ctlkacct.c
|
|
|
|
Abstract:
|
|
|
|
Local Security Authority Subsystem - Short CT for Win 32 LookupAccountName/Sid
|
|
|
|
This is a small test that simply calls the Win 32 LookupAccountName/Sid
|
|
API once.
|
|
|
|
Usage:
|
|
|
|
ctlkacct \\ServerName AccountName
|
|
|
|
Building Instructions:
|
|
|
|
nmake UMTEST=ctlkacc UMTYPE=console
|
|
|
|
Author:
|
|
|
|
Scott Birrell (ScottBi) July 20, 1992
|
|
[ Adapted from a test written by TimF, not completely to Nt standards ]
|
|
|
|
Environment:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
|
|
VOID
|
|
DumpSID(
|
|
IN PSID s
|
|
);
|
|
|
|
#define LSA_WIN_STANDARD_BUFFER_SIZE 0x000000200L
|
|
|
|
VOID __cdecl
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
char SidFromLookupName[LSA_WIN_STANDARD_BUFFER_SIZE];
|
|
char RefDFromLookupName[LSA_WIN_STANDARD_BUFFER_SIZE];
|
|
DWORD cbSidFromLookupName, cchRefDFromLookupName;
|
|
SID_NAME_USE UseFromLookupName;
|
|
|
|
DWORD cchNameFromLookupSid;
|
|
char NameFromLookupSid[LSA_WIN_STANDARD_BUFFER_SIZE];
|
|
char RefDFromLookupSid[LSA_WIN_STANDARD_BUFFER_SIZE];
|
|
DWORD cchRefDFromLookupSid;
|
|
SID_NAME_USE UseFromLookupSid;
|
|
BOOL BoolStatus = TRUE;
|
|
DWORD LastError;
|
|
|
|
if (argc != 3) {
|
|
|
|
printf("usage: ctlkacct <(char *)SystemName> <(char *)AccountName>\n");
|
|
return(0);
|
|
}
|
|
|
|
cbSidFromLookupName = 0;
|
|
cchRefDFromLookupName = 0;
|
|
|
|
BoolStatus = LookupAccountName(argv[1],
|
|
argv[2],
|
|
(PSID)SidFromLookupName,
|
|
&cbSidFromLookupName,
|
|
RefDFromLookupName,
|
|
&cchRefDFromLookupName,
|
|
&UseFromLookupName
|
|
);
|
|
|
|
if (BoolStatus) {
|
|
|
|
printf(
|
|
"LookupAccountName() with zero buffer sizes returned TRUE\n"
|
|
);
|
|
}
|
|
|
|
//
|
|
// Get the Last Error (in DOS errorcode from).
|
|
//
|
|
|
|
LastError = GetLastError();
|
|
|
|
if (LastError != ERROR_INSUFFICIENT_BUFFER) {
|
|
|
|
printf(
|
|
"Unexpected Last Error %d returned from LookupAccountName\n"
|
|
"Expected %d (ERROR_INSUFFICIENT_BUFFER)\n",
|
|
LastError
|
|
);
|
|
}
|
|
|
|
//
|
|
// Now call LookupAccountName() again, using the buffer sizes returned.
|
|
//
|
|
|
|
BoolStatus = LookupAccountName(argv[1],
|
|
argv[2],
|
|
(PSID)SidFromLookupName,
|
|
&cbSidFromLookupName,
|
|
RefDFromLookupName,
|
|
&cchRefDFromLookupName,
|
|
&UseFromLookupName
|
|
);
|
|
|
|
if (!BoolStatus) {
|
|
|
|
printf(
|
|
"LookupAccountName failed - \n"
|
|
"LastError = %d\n",
|
|
GetLastError()
|
|
);
|
|
|
|
return(0);
|
|
}
|
|
|
|
/*
|
|
* Print information returned by LookupAccountName
|
|
*/
|
|
|
|
printf(
|
|
"*********************************************\n"
|
|
"Information returned by LookupAccountName\n"
|
|
"*********************************************\n\n"
|
|
);
|
|
|
|
printf( "Sid = " );
|
|
DumpSID((PSID) SidFromLookupName);
|
|
printf(
|
|
"Size of Sid = %d\n",
|
|
cbSidFromLookupName
|
|
);
|
|
|
|
printf(
|
|
"Referenced Domain Name = %s\n"
|
|
"Size of Referenced Domain Name = %d\n",
|
|
RefDFromLookupName,
|
|
cchRefDFromLookupName
|
|
);
|
|
|
|
printf("Name Use = ");
|
|
|
|
switch (UseFromLookupName) {
|
|
|
|
case SidTypeUser:
|
|
|
|
printf("SidTypeUser\n");
|
|
break;
|
|
|
|
case SidTypeGroup:
|
|
|
|
printf("SidTypeGroup\n");
|
|
break;
|
|
|
|
case SidTypeDomain:
|
|
|
|
printf("SidTypeDomain\n");
|
|
break;
|
|
|
|
case SidTypeAlias:
|
|
|
|
printf("SidTypeAlias\n");
|
|
break;
|
|
|
|
case SidTypeWellKnownGroup:
|
|
|
|
printf("SidTypeWellKnownGroup\n");
|
|
break;
|
|
|
|
case SidTypeDeletedAccount:
|
|
|
|
printf("SidTypeDeletedAccount\n");
|
|
break;
|
|
|
|
case SidTypeInvalid:
|
|
|
|
printf("SidTypeInvalid\n");
|
|
break;
|
|
|
|
case SidTypeUnknown:
|
|
|
|
printf("SidTypeUnknown\n");
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
cchNameFromLookupSid = 0;
|
|
cchRefDFromLookupSid = 0;
|
|
|
|
//
|
|
// Now lookup the Sid we just obtained and see if we get the name back.
|
|
// First, provide zero buffer sizes so that we get the sizes needed
|
|
// returned.
|
|
//
|
|
|
|
cchNameFromLookupSid = 0;
|
|
cchRefDFromLookupSid = 0;
|
|
|
|
BoolStatus = LookupAccountSid(argv[1],
|
|
(PSID) SidFromLookupName,
|
|
NameFromLookupSid,
|
|
&cchNameFromLookupSid,
|
|
RefDFromLookupSid,
|
|
&cchRefDFromLookupSid,
|
|
&UseFromLookupSid
|
|
);
|
|
|
|
if (BoolStatus) {
|
|
|
|
printf("LookupAccountSid() with zero buffer sizes returned TRUE\n");
|
|
}
|
|
|
|
//
|
|
// Get the Last Error (in DOS errorcode from).
|
|
//
|
|
|
|
LastError = GetLastError();
|
|
|
|
if (LastError != ERROR_INSUFFICIENT_BUFFER) {
|
|
|
|
printf(
|
|
"Unexpected Last Error %d returned from LookupAccountSid\n"
|
|
"Expected %d (ERROR_INSUFFICIENT_BUFFER)\n",
|
|
LastError
|
|
);
|
|
}
|
|
|
|
//
|
|
// Now call LookupAccountSid() again, using the buffer sizes obtained
|
|
// from the previous call.
|
|
//
|
|
|
|
if (!LookupAccountSid(argv[1],
|
|
(PSID) SidFromLookupName,
|
|
NameFromLookupSid,
|
|
&cchNameFromLookupSid,
|
|
RefDFromLookupSid,
|
|
&cchRefDFromLookupSid,
|
|
&UseFromLookupSid
|
|
)) {
|
|
|
|
printf(
|
|
"LookupAccountSid failed\n"
|
|
"LastError = %d\n",
|
|
GetLastError()
|
|
);
|
|
|
|
return(0);
|
|
}
|
|
|
|
/*
|
|
* Print information returned by LookupAccountSid
|
|
*/
|
|
|
|
printf(
|
|
"*********************************************\n"
|
|
"Information returned by LookupAccountSid\n"
|
|
"*********************************************\n\n"
|
|
);
|
|
|
|
printf(
|
|
"Account Name = %s\n"
|
|
"Account Name Size (chars) = %d\n"
|
|
"Referenced Domain Name = %s\n"
|
|
"Referenced Domain Size (chars) = %d\n",
|
|
NameFromLookupSid,
|
|
cchNameFromLookupSid,
|
|
RefDFromLookupSid,
|
|
cchRefDFromLookupSid
|
|
);
|
|
|
|
printf("Sid Use = ");
|
|
|
|
switch (UseFromLookupSid) {
|
|
|
|
case SidTypeUser:
|
|
|
|
printf("SidTypeUser\n");
|
|
break;
|
|
|
|
case SidTypeGroup:
|
|
|
|
printf("SidTypeGroup\n");
|
|
break;
|
|
|
|
case SidTypeDomain:
|
|
|
|
printf("SidTypeDomain\n");
|
|
break;
|
|
|
|
case SidTypeAlias:
|
|
|
|
printf("SidTypeAlias\n");
|
|
break;
|
|
|
|
case SidTypeWellKnownGroup:
|
|
|
|
printf("SidTypeWellKnownGroup\n");
|
|
break;
|
|
|
|
case SidTypeDeletedAccount:
|
|
|
|
printf("SidTypeDeletedAccount\n");
|
|
break;
|
|
|
|
case SidTypeInvalid:
|
|
|
|
printf("SidTypeInvalid\n");
|
|
break;
|
|
|
|
case SidTypeUnknown:
|
|
|
|
printf("SidTypeUnknown\n");
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
VOID
|
|
DumpSID(
|
|
IN PSID s
|
|
)
|
|
|
|
{
|
|
static char b[128];
|
|
|
|
SID_IDENTIFIER_AUTHORITY *a;
|
|
ULONG id = 0, i;
|
|
|
|
try {
|
|
|
|
b[0] = '\0';
|
|
|
|
a = GetSidIdentifierAuthority(s);
|
|
|
|
sprintf(b, "s-0x1-%02x%02x%02x%02x%02x%02x", a -> Value[0],
|
|
a -> Value[1], a -> Value[2], a -> Value[3], a ->
|
|
Value[4], a -> Value[5]);
|
|
|
|
for (i = 0; i < *GetSidSubAuthorityCount(s); i++) {
|
|
|
|
sprintf(b, "%s-0x%lx", b, *GetSidSubAuthority(s, i));
|
|
}
|
|
|
|
printf("%s\n", b);
|
|
|
|
} except (EXCEPTION_EXECUTE_HANDLER) {
|
|
|
|
if (*b) {
|
|
|
|
printf("%s", b);
|
|
}
|
|
|
|
printf("<invalid pointer (0x%lx)>\n", s);
|
|
}
|
|
}
|
|
|