You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
208 lines
5.6 KiB
208 lines
5.6 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
asrequest.cxx
|
|
|
|
Abstract:
|
|
|
|
enumusers
|
|
|
|
Author:
|
|
|
|
Larry Zhu (LZhu) December 1, 2001 Created
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include <kerberos.h>
|
|
#include "asrequest.hxx"
|
|
|
|
void
|
|
Usage(
|
|
IN PCSTR pszApp
|
|
)
|
|
{
|
|
DebugPrintf(SSPI_ERROR, "\n\nUsage: %s -c<client name> -C<client realm> "
|
|
"-s<server name> -S<server realm> -t<server name type> -p<client password>\n\n", pszApp);
|
|
exit(-1);
|
|
}
|
|
|
|
#if 0
|
|
|
|
typedef struct _KERB_TICKET_AS_REQUEST {
|
|
KERB_PROTOCOL_MESSAGE_TYPE MessageType;
|
|
ULONG Flags;
|
|
ULONG NameType;
|
|
UNICODE_STRING ClientName;
|
|
UNICODE_STRING ClientRealm;
|
|
UNICODE_STRING ClientPassword;
|
|
UNICODE_STRING ServerName; // optional, default to krbtgt
|
|
UNICODE_STRING ServerRealm; // optinal, default to local realm
|
|
} KERB_TICKET_AS_REQUEST, *PKERB_TICKET_AS_REQUEST;
|
|
|
|
#endif
|
|
|
|
VOID __cdecl
|
|
main(
|
|
IN INT argc,
|
|
IN PSTR argv[]
|
|
)
|
|
{
|
|
TNtStatus Status = STATUS_SUCCESS;
|
|
|
|
NTSTATUS AuthPackageStatus = STATUS_UNSUCCESSFUL;
|
|
|
|
HANDLE LogonHandle = NULL;
|
|
ULONG PackageId = -1;
|
|
|
|
KERB_TICKET_AS_REQUEST AsReq;
|
|
KERB_TICKET_AS_REQUEST* pAsRequest = NULL;
|
|
ULONG cbAsQuest = sizeof(KERB_TICKET_AS_REQUEST);
|
|
|
|
KERB_TICKET_AS_REQUEST* pAsResp = NULL;
|
|
ULONG AsResponseLength = 0;
|
|
CHAR* pWhere = NULL;
|
|
|
|
RtlZeroMemory(&AsReq, sizeof(AsReq));
|
|
|
|
AsReq.MessageType = (KERB_PROTOCOL_MESSAGE_TYPE) KerbTicketAsRequestMessage;
|
|
|
|
/* allow the user to override settings with command line switches */
|
|
for (int i = 1; NT_SUCCESS(Status) && (i < argc); i++)
|
|
{
|
|
if ((*argv[i] == '-') || (*argv[i] == '/'))
|
|
{
|
|
switch (argv[i][1])
|
|
{
|
|
case 'c':
|
|
Status DBGCHK = CreateUnicodeStringFromAsciiz(argv[i] + 2, &AsReq.ClientName);
|
|
cbAsQuest += AsReq.ClientName.MaximumLength;
|
|
break;
|
|
|
|
case 'C':
|
|
Status DBGCHK = CreateUnicodeStringFromAsciiz(argv[i] + 2, &AsReq.ClientRealm);
|
|
cbAsQuest += AsReq.ClientRealm.MaximumLength;
|
|
break;
|
|
|
|
case 's':
|
|
Status DBGCHK = CreateUnicodeStringFromAsciiz(argv[i] + 2, &AsReq.ServerName);
|
|
cbAsQuest += AsReq.ServerName.MaximumLength;
|
|
break;
|
|
|
|
case 'S':
|
|
Status DBGCHK = CreateUnicodeStringFromAsciiz(argv[i] + 2, &AsReq.ServerRealm);
|
|
cbAsQuest += AsReq.ServerRealm.MaximumLength;
|
|
break;
|
|
|
|
case 'p':
|
|
Status DBGCHK = CreateUnicodeStringFromAsciiz(argv[i] + 2, &AsReq.ClientPassword);
|
|
cbAsQuest += AsReq.ClientPassword.MaximumLength;
|
|
break;
|
|
|
|
case 't':
|
|
AsReq.NameType = strtol(argv[i] + 2, NULL, 0);
|
|
break;
|
|
|
|
case 'h':
|
|
case '?':
|
|
default:
|
|
Usage(argv[0]);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage(argv[0]);
|
|
}
|
|
}
|
|
|
|
if (NT_SUCCESS(Status) && (AsReq.NameType == KRB_NT_UNKNOWN))
|
|
{
|
|
DebugPrintf(SSPI_ERROR, "server name type required\n");
|
|
Status DBGCHK = STATUS_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
Status DBGCHK = GetLsaHandleAndPackageId(
|
|
MICROSOFT_KERBEROS_NAME_A,
|
|
&LogonHandle,
|
|
&PackageId
|
|
);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
pAsRequest = (KERB_TICKET_AS_REQUEST*) new UCHAR[cbAsQuest];
|
|
Status DBGCHK = pAsRequest ? S_OK : STATUS_NO_MEMORY;
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
pWhere = ((CHAR*) pAsRequest) + sizeof(KERB_TICKET_AS_REQUEST);
|
|
*pAsRequest = AsReq;
|
|
|
|
RelocatePackUnicodeString(&pAsRequest->ClientRealm, &pWhere);
|
|
RelocatePackUnicodeString(&pAsRequest->ClientName, &pWhere);
|
|
RelocatePackUnicodeString(&pAsRequest->ClientPassword, &pWhere);
|
|
RelocatePackUnicodeString(&pAsRequest->ServerRealm, &pWhere);
|
|
RelocatePackUnicodeString(&pAsRequest->ServerName, &pWhere);
|
|
|
|
DebugPrintf(SSPI_LOG,
|
|
"pAsRequest %p, ClientRealm (%wZ), ClientName (%wZ), "
|
|
"ClientPassword (%wZ), ServerRealm (%wZ), "
|
|
"ServerName (%wZ), SererNameType %d(%#x), pWhere %p\n",
|
|
pAsRequest,
|
|
&pAsRequest->ClientRealm,
|
|
&pAsRequest->ClientName,
|
|
&pAsRequest->ClientPassword,
|
|
&pAsRequest->ServerRealm,
|
|
&pAsRequest->ServerName,
|
|
pAsRequest->NameType,
|
|
pAsRequest->NameType,
|
|
pWhere);
|
|
|
|
Status DBGCHK = LsaCallAuthenticationPackage(
|
|
LogonHandle,
|
|
PackageId,
|
|
pAsRequest,
|
|
cbAsQuest,
|
|
(PVOID*) &pAsResp,
|
|
&AsResponseLength,
|
|
&AuthPackageStatus
|
|
);
|
|
}
|
|
|
|
if (LogonHandle != NULL)
|
|
{
|
|
LsaDeregisterLogonProcess(LogonHandle);
|
|
}
|
|
|
|
RtlFreeUnicodeString(&AsReq.ClientName);
|
|
RtlFreeUnicodeString(&AsReq.ClientRealm);
|
|
RtlFreeUnicodeString(&AsReq.ServerName);
|
|
RtlFreeUnicodeString(&AsReq.ServerRealm);
|
|
RtlFreeUnicodeString(&AsReq.ClientPassword);
|
|
|
|
if (pAsRequest)
|
|
{
|
|
delete [] pAsRequest;
|
|
}
|
|
|
|
if (pAsResp)
|
|
{
|
|
LsaFreeReturnBuffer(pAsResp);
|
|
}
|
|
}
|
|
|