|
|
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
ctsamdb.c
Abstract:
CT for loading a SAM Accounts Database
This test creates a number of users in the local SAM Database
To build this test:
cd \nt\private\lsa\uclient nmake UMTYPE=console UMTEST=ctsamdb
To run this test:
1. Build lsasrv.dll with LSA_SAM_ACCOUNTS_DOMAIN_TEST flag enabled in file \nt\private\lsa\server\dbp.h
2. On your test system, replace lsasrv.dll in \nt\system32 and reboot.
3. Type ctsamdb n to load SAM Database with n users
4. Type ctsamdb -1 to delete the users you created.
Author:
Scott Birrell (ScottBi) October 19, 1992
Environment:
Revision History:
--*/
#include "lsaclip.h"
/////////////////////////////////////////////////////////////////////////////
// //
// LSA Component Test for RPC API - main program //
// //
/////////////////////////////////////////////////////////////////////////////
VOID CtLsaInitObjectAttributes( IN POBJECT_ATTRIBUTES ObjectAttributes, IN PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService )
/*++
Routine Description:
This function initializes the given Object Attributes structure, including Security Quality Of Service. Memory must be allcated for both ObjectAttributes and Security QOS by the caller.
Arguments:
ObjectAttributes - Pointer to Object Attributes to be initialized.
SecurityQualityOfService - Pointer to Security QOS to be initialized.
Return Value:
None.
--*/
{ SecurityQualityOfService->Length = sizeof(SECURITY_QUALITY_OF_SERVICE); SecurityQualityOfService->ImpersonationLevel = SecurityImpersonation; SecurityQualityOfService->ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; SecurityQualityOfService->EffectiveOnly = FALSE;
//
// Set up the object attributes prior to opening the LSA.
//
InitializeObjectAttributes( ObjectAttributes, NULL, 0L, NULL, NULL );
//
// The InitializeObjectAttributes macro presently stores NULL for
// the SecurityQualityOfService field, so we must manually copy that
// structure for now.
//
ObjectAttributes->SecurityQualityOfService = SecurityQualityOfService; }
VOID __cdecl main (argc, argv) int argc; char **argv;
{ NTSTATUS Status = STATUS_SUCCESS; UNICODE_STRING NumberOfAccounts; ANSI_STRING NumberOfAccountsAnsi; OBJECT_ATTRIBUTES ObjectAttributes; SECURITY_QUALITY_OF_SERVICE SecurityQualityOfService; LSA_HANDLE PolicyHandle;
if (argc != 2) {
printf("\n"); printf("Instructions for using SAM Accounts Domain Test Load\n"); printf("----------------------------------------------------\n"); printf("\n\n"); printf("This program can be used to create n users in a SAM\n"); printf("Accounts domain, or update user information in a domain.\n"); printf("Usernames and other information are pseudo-randomized\n"); printf("and Relative Ids begin at 4096, to avoid conflict with\n"); printf("existing installed accounts\n"); printf("\n"); printf("NOTE: \\\\popcorn\\public\\scottbi\\runsamdb temporarily\n"); printf("contains 340-compatible x86 versions of the four files\n"); printf("described in steps 1. 2. and 3 below.\n"); printf("\n"); printf("1. Replace lsasrv.dll with one compiled with the\n"); printf(" LSA_SAM_ACCOUNTS_DOMAIN_TEST #define enabled\n"); printf(" in file lsa\\server\\dbpolicy.c.\n"); printf("\n"); printf("2. Replace samsrv.dll with one containing chads\n"); printf(" mondo level SamSetInformationUser changes.\n"); printf("\n"); printf("3. Copy runsamdb.cmd and ctsamdb.exe to a directory\n"); printf(" on your path\n"); printf("\n"); printf("4. Reboot system with debugger enabled. Debugger terminal\n"); printf(" will display a message for each 100 users created\n"); printf(" plus the time taken to create the last 100 users.\n"); printf(" If any attempt is made to create an existing user,\n"); printf(" or a user that conflicts with an existing account, the\n"); printf(" total number of occurrences of these to date is displayed.\n"); printf("\n"); printf("5. To load a SAM database with n > 0 users, type:\n"); printf("\n"); printf(" runsamdb n\n"); printf("\n"); printf("6. To update the SAM database with identical information\n"); printf(" to that loaded, repeat the command in 5.\n"); printf("\n"); printf("7. To delete the users you created, type\n"); printf("\n"); printf(" runsamdb -1\n"); printf("\n"); printf("8. Existing accounts not created by the test will not\n"); printf(" normally be affected.\n"); printf("\n"); printf("9. To repeat these instructions, type\n"); printf("\n"); printf(" runsamdb\n"); return; }
RtlInitAnsiString( &NumberOfAccountsAnsi, argv[1] ); RtlAnsiStringToUnicodeString( &NumberOfAccounts, &NumberOfAccountsAnsi, TRUE );
CtLsaInitObjectAttributes( &ObjectAttributes, &SecurityQualityOfService );
//
// Open a handle to the local Policy Object. Use a benign access
// mask, because we won't check it.
//
Status = LsaOpenPolicy( NULL, &ObjectAttributes, POLICY_VIEW_LOCAL_INFORMATION, &PolicyHandle );
if (!NT_SUCCESS(Status)) {
printf("LSA RPC CT - LsaOpenPolicy failed 0x%lx\n", Status); return; }
//
// Use an information class in LsaSetInformationPolicy() that can't be
// specified normally on a set operation.
//
Status = LsaSetInformationPolicy( PolicyHandle, PolicyPdAccountInformation, &NumberOfAccounts );
Status = LsaClose( PolicyHandle ); }
|