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.
152 lines
3.8 KiB
152 lines
3.8 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
derivecred.cxx
|
|
|
|
Abstract:
|
|
|
|
derivecred
|
|
|
|
Author:
|
|
|
|
Larry Zhu (LZhu) December 1, 2001 Created
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include "derivecred.hxx"
|
|
|
|
VOID
|
|
Usage(
|
|
IN PCWSTR pszProgramName
|
|
)
|
|
{
|
|
DebugPrintf(SSPI_LOG, "Usage: %ws -a <account name> -p <privilege to add> -P <privilege to remove> -r <system access to set> -s <server name>\n", pszProgramName);
|
|
DebugPrintf(SSPI_LOG, "example system access are SECURITY_ACCESS_INTERACTIVE_LOGON and SECURITY_ACCESS_DENY_SERVICE_LOGON\n");
|
|
exit(1);
|
|
}
|
|
|
|
VOID __cdecl
|
|
_tmain(
|
|
IN INT argc,
|
|
IN PTSTR argv[]
|
|
)
|
|
{
|
|
TNtStatus Status = STATUS_SUCCESS;
|
|
|
|
CHAR Data[4094] = {0};
|
|
MSV1_0_DERIVECRED_REQUEST* pDeriveCred = NULL;
|
|
MSV1_0_DERIVECRED_RESPONSE* pDeriveCredResponse = NULL;
|
|
LUID LogonId = {0x3e4, 0};
|
|
ULONG Type = MSV1_0_DERIVECRED_TYPE_SHA1;
|
|
ULONG cbDataToDerive = 8;
|
|
ULONG cbRequest = 0;
|
|
HANDLE hLsa = NULL;
|
|
ULONG PackageId = 0;
|
|
NTSTATUS SubStatus = STATUS_UNSUCCESSFUL;
|
|
ULONG cbResponse = 0;
|
|
|
|
for (INT i = 1; i < argc; i++)
|
|
{
|
|
if ((*argv[i] == '-') || (*argv[i] == '/'))
|
|
{
|
|
switch (*(argv[i] + 1))
|
|
{
|
|
case 'l':
|
|
LogonId.LowPart = wcstol(argv[++i], NULL, 0);
|
|
break;
|
|
case 'h':
|
|
LogonId.HighPart = wcstol(argv[++i], NULL, 0);
|
|
break;
|
|
case 't':
|
|
Type = wcstol(argv[++i], NULL, 0);
|
|
break;
|
|
case 'd':
|
|
cbDataToDerive = wcstol(argv[++i], NULL, 0);
|
|
break;
|
|
case '?':
|
|
default:
|
|
Usage(argv[0]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Usage(argv[0]);
|
|
}
|
|
}
|
|
|
|
cbRequest = sizeof(MSV1_0_DERIVECRED_REQUEST) + cbDataToDerive;
|
|
|
|
pDeriveCred = (MSV1_0_DERIVECRED_REQUEST*) new CHAR[cbRequest];
|
|
|
|
Status DBGCHK = pDeriveCred ? STATUS_SUCCESS : STATUS_NO_MEMORY;
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
RtlZeroMemory(pDeriveCred, cbRequest);
|
|
pDeriveCred->LogonId = LogonId;
|
|
pDeriveCred->MessageType = MsV1_0DeriveCredential;
|
|
pDeriveCred->DeriveCredType = Type;
|
|
pDeriveCred->DeriveCredInfoLength = cbDataToDerive;
|
|
RtlCopyMemory(pDeriveCred->DeriveCredSubmitBuffer, Data, cbDataToDerive);
|
|
|
|
Status DBGCHK = GetLsaHandleAndPackageId(
|
|
MSV1_0_PACKAGE_NAME,
|
|
&hLsa,
|
|
&PackageId
|
|
);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
SspiPrint(SSPI_LOG, TEXT("DeriveCred type %#x, LogonId %#x:%#x\n"),
|
|
pDeriveCred->DeriveCredType, pDeriveCred->LogonId.HighPart, pDeriveCred->LogonId.LowPart);
|
|
SspiPrintHex(SSPI_LOG, TEXT("Data to derive"), pDeriveCred->DeriveCredInfoLength, pDeriveCred->DeriveCredSubmitBuffer);
|
|
Status DBGCHK = LsaCallAuthenticationPackage(
|
|
hLsa,
|
|
PackageId,
|
|
pDeriveCred,
|
|
cbRequest,
|
|
(PVOID*) &pDeriveCredResponse,
|
|
&cbResponse,
|
|
&SubStatus
|
|
);
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
Status DBGCHK = SubStatus;
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
SspiPrintHex(SSPI_LOG, TEXT("Response"), pDeriveCredResponse->DeriveCredInfoLength, pDeriveCredResponse->DeriveCredReturnBuffer);
|
|
}
|
|
|
|
if (pDeriveCredResponse)
|
|
{
|
|
LsaFreeReturnBuffer(pDeriveCredResponse);
|
|
}
|
|
|
|
if (pDeriveCred)
|
|
{
|
|
delete [] pDeriveCred;
|
|
}
|
|
|
|
if (hLsa)
|
|
{
|
|
LsaDeregisterLogonProcess(hLsa);
|
|
}
|
|
}
|
|
|