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