413 lines
9 KiB
C
413 lines
9 KiB
C
|
/*--
|
|||
|
|
|||
|
Copyright (c) 1987-1993 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
pwdtest.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Test program for the changing passwords.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
30-Apr-1993 (cliffv)
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User mode only.
|
|||
|
Contains NT-specific code.
|
|||
|
Requires ANSI C extensions: slash-slash comments, long external names.
|
|||
|
|
|||
|
Revision History:
|
|||
|
Chandana Surlu 21-Jul-96 Stolen from \\kernel\razzle3\src\security\msv1_0\pwdtest.c
|
|||
|
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Common include files.
|
|||
|
//
|
|||
|
|
|||
|
#include <msp.h>
|
|||
|
#define NLP_ALLOCATE
|
|||
|
#include <nlp.h>
|
|||
|
#include <lsarpc.h> // Lsar routines
|
|||
|
#include <lsaisrv.h> // LsaIFree and Trusted Client Routines
|
|||
|
#include <stdio.h>
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Dummy routines from LSA
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsapAllocateClientBuffer (
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN ULONG LengthRequired,
|
|||
|
OUT PVOID *ClientBaseAddress
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
|
|||
|
UNREFERENCED_PARAMETER (ClientRequest);
|
|||
|
*ClientBaseAddress = RtlAllocateHeap( MspHeap, 0, LengthRequired );
|
|||
|
|
|||
|
if ( *ClientBaseAddress == NULL ) {
|
|||
|
return(STATUS_QUOTA_EXCEEDED);
|
|||
|
}
|
|||
|
|
|||
|
return(STATUS_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsapFreeClientBuffer (
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN PVOID ClientBaseAddress OPTIONAL
|
|||
|
)
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER (ClientRequest);
|
|||
|
UNREFERENCED_PARAMETER (ClientBaseAddress);
|
|||
|
|
|||
|
return(STATUS_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsapCopyToClientBuffer (
|
|||
|
IN PLSA_CLIENT_REQUEST ClientRequest,
|
|||
|
IN ULONG Length,
|
|||
|
IN PVOID ClientBaseAddress,
|
|||
|
IN PVOID BufferToCopy
|
|||
|
)
|
|||
|
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER (ClientRequest);
|
|||
|
RtlMoveMemory( ClientBaseAddress, BufferToCopy, Length );
|
|||
|
return(STATUS_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
int __cdecl
|
|||
|
main(
|
|||
|
IN int argc,
|
|||
|
IN char ** argv
|
|||
|
)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Drive the password changing.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
argc - the number of command-line arguments.
|
|||
|
|
|||
|
argv - an array of pointers to the arguments.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
Exit status
|
|||
|
|
|||
|
--*/
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
MSV1_0_CHANGEPASSWORD_REQUEST Request;
|
|||
|
PMSV1_0_CHANGEPASSWORD_RESPONSE ReturnBuffer;
|
|||
|
ULONG ReturnBufferSize;
|
|||
|
NTSTATUS ProtocolStatus;
|
|||
|
OBJECT_ATTRIBUTES LSAObjectAttributes;
|
|||
|
UNICODE_STRING LocalComputerName = { 0, 0, NULL };
|
|||
|
PPOLICY_PRIMARY_DOMAIN_INFO PrimaryDomainInfo = NULL;
|
|||
|
|
|||
|
if ( argc < 5 ) {
|
|||
|
fprintf( stderr,
|
|||
|
"Usage: pwdtest DomainName UserName OldPassword NewPassword\n" );
|
|||
|
return(1);
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Set up MSV1_0.dll environment.
|
|||
|
//
|
|||
|
|
|||
|
MspHeap = RtlProcessHeap();
|
|||
|
|
|||
|
Status = NlInitialize();
|
|||
|
|
|||
|
if ( !NT_SUCCESS( Status ) ) {
|
|||
|
printf("pwdtest: NlInitialize failed, status %x\n", Status);
|
|||
|
return(1);
|
|||
|
}
|
|||
|
|
|||
|
Lsa.AllocateClientBuffer = LsapAllocateClientBuffer;
|
|||
|
Lsa.FreeClientBuffer = LsapFreeClientBuffer;
|
|||
|
Lsa.CopyToClientBuffer = LsapCopyToClientBuffer;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Open the LSA policy database in case change password needs it
|
|||
|
//
|
|||
|
|
|||
|
InitializeObjectAttributes( &LSAObjectAttributes,
|
|||
|
NULL, // Name
|
|||
|
0, // Attributes
|
|||
|
NULL, // Root
|
|||
|
NULL ); // Security Descriptor
|
|||
|
|
|||
|
Status = LsaOpenPolicy( &LocalComputerName,
|
|||
|
&LSAObjectAttributes,
|
|||
|
POLICY_VIEW_LOCAL_INFORMATION,
|
|||
|
&NlpPolicyHandle );
|
|||
|
|
|||
|
if( !NT_SUCCESS(Status) ) {
|
|||
|
printf("pwdtest: LsaOpenPolicy failed, status %x\n", Status);
|
|||
|
return(1);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Get the name of our domain.
|
|||
|
//
|
|||
|
|
|||
|
Status = LsaQueryInformationPolicy(
|
|||
|
NlpPolicyHandle,
|
|||
|
PolicyPrimaryDomainInformation,
|
|||
|
(PVOID *) &PrimaryDomainInfo );
|
|||
|
|
|||
|
if( !NT_SUCCESS(Status) ) {
|
|||
|
KdPrint(("pwdtest: LsaQueryInformationPolicy failed, status %x\n",
|
|||
|
Status));
|
|||
|
return(1);
|
|||
|
}
|
|||
|
|
|||
|
NlpSamDomainName = PrimaryDomainInfo->Name;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Build the request message
|
|||
|
//
|
|||
|
|
|||
|
Request.MessageType = MsV1_0ChangePassword;
|
|||
|
RtlCreateUnicodeStringFromAsciiz( &Request.DomainName, argv[1] );
|
|||
|
RtlCreateUnicodeStringFromAsciiz( &Request.AccountName, argv[2] );
|
|||
|
RtlCreateUnicodeStringFromAsciiz( &Request.OldPassword, argv[3] );
|
|||
|
RtlCreateUnicodeStringFromAsciiz( &Request.NewPassword, argv[4] );
|
|||
|
|
|||
|
Status = MspLm20ChangePassword( NULL,
|
|||
|
&Request,
|
|||
|
&Request,
|
|||
|
0x7FFFFFFF,
|
|||
|
(PVOID *) &ReturnBuffer,
|
|||
|
&ReturnBufferSize,
|
|||
|
&ProtocolStatus );
|
|||
|
|
|||
|
printf( "Status = 0x%lx 0x%lx\n", Status, ProtocolStatus );
|
|||
|
|
|||
|
if ( ProtocolStatus == STATUS_CANT_DISABLE_MANDATORY ) {
|
|||
|
printf( "Are you running as SYSTEM?\n" );
|
|||
|
}
|
|||
|
|
|||
|
if ( ReturnBufferSize != 0 ) {
|
|||
|
printf( "PasswordInfoValid %ld\n", ReturnBuffer->PasswordInfoValid );
|
|||
|
if ( ReturnBuffer->PasswordInfoValid ) {
|
|||
|
printf( "Min length: %ld PasswordHistory: %ld Prop 0x%lx\n",
|
|||
|
ReturnBuffer->DomainPasswordInfo.MinPasswordLength,
|
|||
|
ReturnBuffer->DomainPasswordInfo.PasswordHistoryLength,
|
|||
|
ReturnBuffer->DomainPasswordInfo.PasswordProperties );
|
|||
|
}
|
|||
|
}
|
|||
|
return 0;
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Stub routines needed by msvpaswd.c
|
|||
|
//
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
LsarQueryInformationPolicy(
|
|||
|
IN LSAPR_HANDLE PolicyHandle,
|
|||
|
IN POLICY_INFORMATION_CLASS InfoClass,
|
|||
|
OUT PLSAPR_POLICY_INFORMATION *Buffer
|
|||
|
)
|
|||
|
{
|
|||
|
return( LsaQueryInformationPolicy( PolicyHandle,
|
|||
|
InfoClass,
|
|||
|
Buffer ) );
|
|||
|
}
|
|||
|
|
|||
|
VOID
|
|||
|
LsaIFree_LSAPR_POLICY_INFORMATION (
|
|||
|
POLICY_INFORMATION_CLASS InfoClass,
|
|||
|
PLSAPR_POLICY_INFORMATION Buffer
|
|||
|
)
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER (InfoClass);
|
|||
|
UNREFERENCED_PARAMETER (Buffer);
|
|||
|
}
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NlpChangePassword(
|
|||
|
IN PUNICODE_STRING DomainName,
|
|||
|
IN PUNICODE_STRING UserName,
|
|||
|
IN PLM_OWF_PASSWORD LmOwfPassword,
|
|||
|
IN PNT_OWF_PASSWORD NtOwfPassword
|
|||
|
)
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER (DomainName);
|
|||
|
UNREFERENCED_PARAMETER (UserName);
|
|||
|
UNREFERENCED_PARAMETER (LmOwfPassword);
|
|||
|
UNREFERENCED_PARAMETER (NtOwfPassword);
|
|||
|
return(STATUS_SUCCESS);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
NTSTATUS
|
|||
|
NlInitialize(
|
|||
|
VOID
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
Initialize NETLOGON portion of msv1_0 authentication package.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
None.
|
|||
|
|
|||
|
Return Status:
|
|||
|
|
|||
|
STATUS_SUCCESS - Indicates NETLOGON successfully initialized.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
NTSTATUS Status;
|
|||
|
LPWSTR ComputerName;
|
|||
|
DWORD ComputerNameLength = MAX_COMPUTERNAME_LENGTH + 1;
|
|||
|
NT_PRODUCT_TYPE NtProductType;
|
|||
|
UNICODE_STRING TempUnicodeString;
|
|||
|
|
|||
|
//
|
|||
|
// Initialize global data
|
|||
|
//
|
|||
|
|
|||
|
NlpEnumerationHandle = 0;
|
|||
|
NlpSessionCount = 0;
|
|||
|
|
|||
|
NlpComputerName.Buffer = NULL;
|
|||
|
NlpSamDomainName.Buffer = NULL;
|
|||
|
NlpSamDomainId = NULL;
|
|||
|
NlpSamDomainHandle = NULL;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Get the name of this machine.
|
|||
|
//
|
|||
|
|
|||
|
ComputerName = RtlAllocateHeap(
|
|||
|
MspHeap, 0,
|
|||
|
ComputerNameLength * sizeof(WCHAR) );
|
|||
|
|
|||
|
if (ComputerName == NULL ||
|
|||
|
!GetComputerNameW( ComputerName, &ComputerNameLength )) {
|
|||
|
|
|||
|
KdPrint(( "MsV1_0: Cannot get computername %lX\n", GetLastError() ));
|
|||
|
|
|||
|
NlpLanmanInstalled = FALSE;
|
|||
|
RtlFreeHeap( MspHeap, 0, ComputerName );
|
|||
|
ComputerName = NULL;
|
|||
|
} else {
|
|||
|
|
|||
|
NlpLanmanInstalled = TRUE;
|
|||
|
}
|
|||
|
|
|||
|
RtlInitUnicodeString( &NlpComputerName, ComputerName );
|
|||
|
|
|||
|
//
|
|||
|
// Determine if this machine is running Windows NT or Lanman NT.
|
|||
|
// LanMan NT runs on a domain controller.
|
|||
|
//
|
|||
|
|
|||
|
if ( !RtlGetNtProductType( &NtProductType ) ) {
|
|||
|
KdPrint(( "MsV1_0: Nt Product Type undefined (WinNt assumed)\n" ));
|
|||
|
NtProductType = NtProductWinNt;
|
|||
|
}
|
|||
|
|
|||
|
NlpWorkstation = (BOOLEAN)(NtProductType != NtProductLanManNt);
|
|||
|
|
|||
|
|
|||
|
#ifdef notdef
|
|||
|
|
|||
|
//
|
|||
|
// Initialize any locks.
|
|||
|
//
|
|||
|
|
|||
|
RtlInitializeCriticalSection(&NlpActiveLogonLock);
|
|||
|
RtlInitializeCriticalSection(&NlpSessionCountLock);
|
|||
|
|
|||
|
//
|
|||
|
// initialize the cache - creates a critical section is all
|
|||
|
//
|
|||
|
|
|||
|
NlpCacheInitialize();
|
|||
|
#endif // notdef
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Attempt to load Netapi.dll
|
|||
|
//
|
|||
|
|
|||
|
NlpLoadNetapiDll();
|
|||
|
|
|||
|
#ifdef COMPILED_BY_DEVELOPER
|
|||
|
KdPrint(("msv1_0: COMPILED_BY_DEVELOPER breakpoint.\n"));
|
|||
|
DbgBreakPoint();
|
|||
|
#endif // COMPILED_BY_DEVELOPER
|
|||
|
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Initialize useful encryption constants
|
|||
|
//
|
|||
|
|
|||
|
Status = RtlCalculateLmOwfPassword( "", &NlpNullLmOwfPassword );
|
|||
|
ASSERT( NT_SUCCESS(Status) );
|
|||
|
|
|||
|
RtlInitUnicodeString(&TempUnicodeString, NULL);
|
|||
|
Status = RtlCalculateNtOwfPassword(&TempUnicodeString,
|
|||
|
&NlpNullNtOwfPassword);
|
|||
|
ASSERT( NT_SUCCESS(Status) );
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#ifdef notdef
|
|||
|
//
|
|||
|
// If we weren't successful,
|
|||
|
// Clean up global resources we intended to initialize.
|
|||
|
//
|
|||
|
|
|||
|
if ( !NT_SUCCESS(Status) ) {
|
|||
|
if ( NlpComputerName.Buffer != NULL ) {
|
|||
|
MIDL_user_free( NlpComputerName.Buffer );
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
#endif // notdef
|
|||
|
|
|||
|
return STATUS_SUCCESS;
|
|||
|
|
|||
|
}
|