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.
546 lines
15 KiB
546 lines
15 KiB
//*************************************************************
|
|
//
|
|
// Group Policy Performance test program
|
|
//
|
|
// Copyright (c) Microsoft Corporation 1997-1998
|
|
//
|
|
// History: 10-Dec-98 SitaramR Created from DKays version
|
|
//
|
|
//*************************************************************
|
|
|
|
#define UNICODE
|
|
|
|
#include <windows.h>
|
|
#define SECURITY_WIN32
|
|
#include <security.h>
|
|
#include <stdio.h>
|
|
#include <ole2.h>
|
|
#include <prsht.h>
|
|
#include <initguid.h>
|
|
#include <gpedit.h>
|
|
#include <iads.h>
|
|
#include <adshlp.h>
|
|
|
|
const MAX_BUF_LEN = 2056; // Static buffer size
|
|
#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
|
|
|
|
void PrintHelp();
|
|
BOOL CreateTest2GPOs( WCHAR *pwszDomain );
|
|
BOOL CreateTest3GPOs( WCHAR *pwszDomain );
|
|
BOOL CreateTest4GPOs( WCHAR *pwszDomain );
|
|
BOOL CreateTest5GPOs( WCHAR *pwszDomain );
|
|
|
|
GUID guidExtensions[] = { // List of GP client side extension guids
|
|
{ 0x25537BA6, 0x77A8, 0x11D2, {0x9B, 0x6C, 0x00, 0x00, 0xF8, 0x08, 0x08, 0x61}},
|
|
{ 0x35378EAC, 0x683F, 0x11D2, {0xA8, 0x9A, 0x00, 0xC0, 0x4F, 0xBB, 0xCF, 0xA2}},
|
|
{ 0x3610eda5, 0x77ef, 0x11d2, {0x8d, 0xc5, 0x00, 0xc0, 0x4f, 0xa3, 0x1a, 0x66}},
|
|
{ 0x42B5FAAE, 0x6536, 0x11d2, {0xAE, 0x5A, 0x00, 0x00, 0xF8, 0x75, 0x71, 0xE3}},
|
|
{ 0x827d319e, 0x6eac, 0x11d2, {0xa4, 0xea, 0x00, 0xc0, 0x4f, 0x79, 0xf8, 0x3a}},
|
|
{ 0xb1be8d72, 0x6eac, 0x11d2, {0xa4, 0xea, 0x00, 0xc0, 0x4f, 0x79, 0xf8, 0x3a}},
|
|
{ 0xc6dc5466, 0x785a, 0x11d2, {0x84, 0xd0, 0x00, 0xc0, 0x4f, 0xb1, 0x69, 0xf7}},
|
|
};
|
|
GUID guidSnapin = { 0xdd7f2e0f, 0x9089, 0x11d2, {0xb2, 0x81, 0x00, 0xc0, 0x4f, 0xbb, 0xcf, 0xa2 }};
|
|
|
|
|
|
int __cdecl main( int argc, char **argv )
|
|
{
|
|
for ( int n = 1; n < argc; n++ )
|
|
{
|
|
if ( lstrcmpA(argv[n], "-help") == 0
|
|
|| lstrcmpA(argv[n], "/help") == 0
|
|
|| lstrcmpA(argv[n], "-?") == 0
|
|
|| lstrcmpA(argv[n], "/?") == 0 )
|
|
{
|
|
PrintHelp();
|
|
return 0;
|
|
}
|
|
|
|
printf( "Usage: polcreat or polcreat /? to see help info" );
|
|
return 0;
|
|
}
|
|
|
|
WCHAR wszUser[MAX_BUF_LEN];
|
|
ULONG ulSize = ARRAYSIZE(wszUser);
|
|
BOOL bOk = GetUserNameEx( NameFullyQualifiedDN, wszUser, &ulSize );
|
|
|
|
if ( !bOk )
|
|
{
|
|
printf( "GetUserNameEx failed with 0x%x\n", GetLastError() );
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// Get domain path
|
|
//
|
|
|
|
WCHAR wszDomain[MAX_BUF_LEN];
|
|
|
|
lstrcpy( wszDomain, L"LDAP://" );
|
|
|
|
BOOL bFound = FALSE;
|
|
WCHAR *pchCur = wszUser;
|
|
|
|
while ( pchCur && *pchCur != 0 && lstrlen(pchCur) > 3 )
|
|
{
|
|
if ( CompareString (LOCALE_USER_DEFAULT, NORM_IGNORECASE,
|
|
pchCur, 3, TEXT("DC="), 3) == CSTR_EQUAL)
|
|
{
|
|
bFound = TRUE;
|
|
lstrcat( wszDomain, pchCur );
|
|
break;
|
|
}
|
|
|
|
pchCur++;
|
|
}
|
|
|
|
if ( !bFound )
|
|
{
|
|
printf( "Unable to create domain path from user path %ws\n", wszUser );
|
|
return 0;
|
|
}
|
|
|
|
printf( "Using Domain path, %ws\n", wszDomain );
|
|
|
|
CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );
|
|
|
|
printf( "Creating Test2 GPOs\n" );
|
|
bOk = CreateTest2GPOs( wszDomain );
|
|
if ( !bOk )
|
|
{
|
|
printf( "Failed to create test2 GPOs\n" );
|
|
return 0;
|
|
}
|
|
|
|
printf( "Creating Test3 GPOs\n" );
|
|
bOk = CreateTest3GPOs( wszDomain );
|
|
if ( !bOk )
|
|
{
|
|
printf( "Failed to create test3 GPOs\n" );
|
|
return 0;
|
|
}
|
|
|
|
printf( "Creating Test4 GPOs\n" );
|
|
bOk = CreateTest4GPOs( wszDomain );
|
|
if ( !bOk )
|
|
{
|
|
printf( "Failed to create test4 GPOs\n" );
|
|
return 0;
|
|
}
|
|
|
|
printf( "Creating Test5 GPOs\n" );
|
|
bOk = CreateTest5GPOs( wszDomain );
|
|
if ( !bOk )
|
|
{
|
|
printf( "Failed to create test5 GPOs\n" );
|
|
return 0;
|
|
}
|
|
|
|
printf( "Successfully created all OUs and GPOs" );
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CreateOU( WCHAR *pwszParent, WCHAR *pwszOU )
|
|
{
|
|
//
|
|
// Bind to the parent container and create OU
|
|
//
|
|
IADsContainer *pContainer;
|
|
IDispatch *pIDispatch;
|
|
IADs *pADs;
|
|
|
|
HRESULT hr = ADsGetObject( pwszParent,
|
|
IID_IADsContainer,
|
|
(void**)&pContainer);
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Failed to bind to parent container %ws with 0x%x\n", pwszParent, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
hr = pContainer->Create(L"organizationalUnit",
|
|
pwszOU, // L"OU=OU1",
|
|
&pIDispatch );
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Failed to bind to create %ws with 0x%x\n", pwszOU, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
hr = pIDispatch->QueryInterface( IID_IADs, (void **)&pADs);
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Failed to QI %ws with 0x%x\n", pwszOU, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
hr = pADs->SetInfo();
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Failed to SetInfo %ws with 0x%x\n", pwszOU, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CreatePolicies( WCHAR *pwszDomain, WCHAR *pwszOUPath, WCHAR *pwszOUName, ULONG cPolicies )
|
|
{
|
|
//
|
|
// cPolicies must be a multiple of 7 because there are 7 client side
|
|
// extensions.
|
|
//
|
|
|
|
ULONG cPols = cPolicies / 7;
|
|
WCHAR wszGPOName[MAX_BUF_LEN];
|
|
WCHAR wszGPOPath[MAX_BUF_LEN];
|
|
WCHAR wszNum[20];
|
|
LPGROUPPOLICYOBJECT pGPO;
|
|
|
|
for ( ULONG i=0; i<cPols; i++ )
|
|
{
|
|
for ( ULONG j=0; j<7; j++ )
|
|
{
|
|
HRESULT hr = CoCreateInstance( CLSID_GroupPolicyObject,
|
|
NULL,
|
|
CLSCTX_SERVER,
|
|
IID_IGroupPolicyObject,
|
|
(void**)&pGPO );
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "CoCreateInstance of pGPO failed 0x%x\n", hr );
|
|
return FALSE;
|
|
}
|
|
|
|
wcscpy( wszGPOName, pwszOUName );
|
|
wsprintf( wszNum, L"%d%d", i, j );
|
|
wcscat( wszGPOName, wszNum );
|
|
|
|
hr = pGPO->New( pwszDomain, wszGPOName, FALSE );
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Creating new GPO %ws failed 0x%x\n", wszGPOName, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
hr = pGPO->GetPath( wszGPOPath, ARRAYSIZE(wszGPOPath) );
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Getting GPO path of %ws failed 0x%x\n", wszGPOName, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
hr = pGPO->Save( TRUE, TRUE, &guidExtensions[j], &guidSnapin ); // machine policy
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Saving GPO %ws failed 0x%x\n", wszGPOName, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
hr = pGPO->Save( FALSE, TRUE, &guidExtensions[j], &guidSnapin ); // user policy
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Saving GPO %ws failed 0x%x\n", wszGPOName, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
hr = CreateGPOLink( wszGPOPath, pwszOUPath, FALSE );
|
|
if ( hr != S_OK )
|
|
{
|
|
printf( "Linking GPO %ws failed 0x%x\n", wszGPOName, hr );
|
|
return FALSE;
|
|
}
|
|
|
|
pGPO->Release();
|
|
} // for j
|
|
} // for i
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL MakeLdapPath( WCHAR *pwszParent, WCHAR *pwszOU, WCHAR *pwszChild )
|
|
{
|
|
//
|
|
// Make ldap path to child by prepending OU to parent path
|
|
//
|
|
|
|
wcscpy( pwszChild, L"LDAP://" );
|
|
wcscat( pwszChild, pwszOU );
|
|
wcscat( pwszChild, L"," );
|
|
wcscat( pwszChild, &pwszParent[7] );
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CreateTest2GPOs( WCHAR *pwszDomain )
|
|
{
|
|
WCHAR wszParent[MAX_BUF_LEN];
|
|
WCHAR wszChild[MAX_BUF_LEN];
|
|
|
|
wcscpy( wszParent, pwszDomain );
|
|
|
|
// OU_L1_P7_T2
|
|
BOOL bOk = CreateOU( wszParent, L"OU=OU_L1_P7_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L1_P7_T2", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L1_P7_T2_GP", 7);
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L1_P0_T2
|
|
bOk = CreateOU( wszParent, L"OU=OU_L1_P0_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P7_T2
|
|
MakeLdapPath( wszParent, L"OU=OU_L1_P0_T2", wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P7_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P7_T2", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P7_T2_GP", 7);
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P0_T2
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P0_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L3_P7_T2
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P0_T2", wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
|
|
bOk = CreateOU( wszParent, L"OU=OU_L3_P7_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L3_P7_T2", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L3_P7_T2_GP", 7);
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L3_P0_T2
|
|
bOk = CreateOU( wszParent, L"OU=OU_L3_P0_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L4_P7_T2
|
|
MakeLdapPath( wszParent, L"OU=OU_L3_P0_T2", wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
|
|
bOk = CreateOU( wszParent, L"OU=OU_L4_P7_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L4_P7_T2", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L4_P7_T2_GP", 7);
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L4_P0_T2
|
|
bOk = CreateOU( wszParent, L"OU=OU_L4_P0_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L5_P7_T2
|
|
MakeLdapPath( wszParent, L"OU=OU_L4_P0_T2", wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
|
|
bOk = CreateOU( wszParent, L"OU=OU_L5_P7_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L5_P7_T2", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L5_P7_T2_GP", 7);
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L5_P0_T2
|
|
bOk = CreateOU( wszParent, L"OU=OU_L5_P0_T2");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CreateTest3GPOs( WCHAR *pwszDomain )
|
|
{
|
|
WCHAR wszParent[MAX_BUF_LEN];
|
|
WCHAR wszChild[MAX_BUF_LEN];
|
|
|
|
wcscpy( wszParent, pwszDomain );
|
|
|
|
// OU_L1_P0_T3
|
|
BOOL bOk = CreateOU( wszParent, L"OU=OU_L1_P0_T3");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P14_T3
|
|
MakeLdapPath( wszParent, L"OU=OU_L1_P0_T3", wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P14_T3");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P14_T3", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P14_T3_GP", 14 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P28_T3
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P28_T3");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P28_T3", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P28_T3_GP", 28 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P56_T3
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P56_T3");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P56_T3", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P56_T3_GP", 56 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P70_T3
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P70_T3");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P70_T3", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P70_T3_GP", 70 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P98_T3
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P98_T3");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P98_T3", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P98_T3_GP", 98 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CreateTest4GPOs( WCHAR *pwszDomain )
|
|
{
|
|
WCHAR wszParent[MAX_BUF_LEN];
|
|
WCHAR wszChild[MAX_BUF_LEN];
|
|
|
|
wcscpy( wszParent, pwszDomain );
|
|
|
|
// OU_L1_P7_T4
|
|
BOOL bOk = CreateOU( wszParent, L"OU=OU_L1_P7_T4");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L1_P7_T4", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L1_P7_T4_GP", 7 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P7_T4
|
|
MakeLdapPath( wszParent, L"OU=OU_L1_P7_T4", wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P7_T4");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P7_T4", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P7_T4_GP", 7 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L1_P14_T4
|
|
wcscpy( wszParent, pwszDomain );
|
|
bOk = CreateOU( wszParent, L"OU=OU_L1_P14_T4");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L1_P14_T4", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L1_P14_T4_GP", 14 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
// OU_L2_P14_T4
|
|
MakeLdapPath( wszParent, L"OU=OU_L1_P14_T4", wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
|
|
bOk = CreateOU( wszParent, L"OU=OU_L2_P14_T4");
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, L"OU=OU_L2_P14_T4", wszChild );
|
|
bOk = CreatePolicies( pwszDomain, wszChild, L"OU_L2_P14_T4_GP", 14 );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CreateTest5GPOs( WCHAR *pwszDomain )
|
|
{
|
|
WCHAR wszParent[MAX_BUF_LEN*10];
|
|
WCHAR wszChild[MAX_BUF_LEN*10];
|
|
WCHAR wszOUString[MAX_BUF_LEN];
|
|
|
|
wcscpy( wszParent, pwszDomain );
|
|
for ( unsigned i=1; i<60; i++ )
|
|
{
|
|
wsprintf( wszOUString, L"OU=OU_L%d_P0_T5", i );
|
|
BOOL bOk = CreateOU( wszParent, wszOUString );
|
|
if ( !bOk )
|
|
return FALSE;
|
|
|
|
MakeLdapPath( wszParent, wszOUString, wszChild );
|
|
wcscpy( wszParent, wszChild );
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
void PrintHelp()
|
|
{
|
|
printf( "Usage: polcreat to create OUs and GPOs or,\n polcreat /? to get performance test cases\n\n" );\
|
|
|
|
printf(" TEST SCENARIOS (Naming covention is: OU_Level#_P#GPOs_T#test)\n");
|
|
printf("\nTest 1:\n");
|
|
printf(" 1. User at Domain level\n\n\n");
|
|
|
|
printf("Test 2:\n");
|
|
printf(" 1. User at OU_L1_P7_T2\n");
|
|
printf(" 2. User at OU_L1_P0_T2, OU_L2_P7_T2\n");
|
|
printf(" 3. User at OU_L1_P0_T2, OU_L2_P0_T2, OU_L3_P7_T2\n");
|
|
printf(" 4. User at OU_L1_P0_T2, OU_L2_P0_T2, OU_L3_P0_T2, OU_L4_P7_T2\n");
|
|
printf(" 5. User at OU_L1_P0_T2, OU_L2_P0_T2, OU_L3_P0_T2, OU_L4_P0_T2, OU_L5_P7_T2\n");
|
|
printf(" 5. User at OU_L1_P0_T2, OU_L2_P0_T2, OU_L3_P0_T2, OU_L4_P0_T2, OU_L5_P0_T2\n\n\n");
|
|
|
|
printf("Test 3:\n");
|
|
printf(" 1. User at OU_L1_P0_T3, OU_L2_P14_T3\n");
|
|
printf(" 2. User at OU_L1_P0_T3, OU_L2_P28_T3\n");
|
|
printf(" 3. User at OU_L1_P0_T3, OU_L2_P70_T3\n\n\n");
|
|
|
|
printf("Test 4:\n");
|
|
printf(" 1. User at OU_L1_P7_T4, OU_L2_P7_T4\n");
|
|
printf(" 2. User at OU_L1_P14_T4, OU_L2_P14_T4\n\n");
|
|
}
|