windows-nt/Source/XPSP1/NT/ds/security/protocols/msv_sspi/pwdtest.c
2020-09-26 16:20:57 +08:00

413 lines
9 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*--
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;
}