//Copyright (c) 1998 - 1999 Microsoft Corporation /****************************************************************************** * * CNVRTUC * * Convert WinFrame User Configuration * * Copyright Citrix Systems Inc. 1997 * * Author: BruceF * * $Log: U:\NT\PRIVATE\UTILS\citrix\cnvrtuc\VCS\CNVRTUC.C $ * * Rev 1.3 May 04 1998 18:03:04 bills * Fixes for MS bug #2109, OEM->ANSI conversion and moving strings to the rc file. * * Rev 1.2 Jun 26 1997 18:17:18 billm * move to WF40 tree * * Rev 1.1 23 Jun 1997 16:17:24 butchd * update * * Rev 1.0 15 Feb 1997 09:51:48 brucef * Initial revision. * * ******************************************************************************/ #include #include #include #include #include #include #include #include #include #include "resource.h" #include #include #if MAX_COMPUTERNAME_LENGTH > DOMAIN_LENGTH #define _COMPUTERNAME_LENGTH MAX_COMPUTER_NAME_LENGTH #else #define _COMPUTERNAME_LENGTH DOMAIN_LENGTH #endif ULONG fAll; WCHAR UserName[ USERNAME_LENGTH + 1 ]; WCHAR DomainName[ _COMPUTERNAME_LENGTH + 1 ]; BOOLEAN ProcessCommandLine( int argc, char *argv[] ); void Print( int nResourceID, ... ); BOOLEAN ConvertUserConfiguration( PWCHAR pUserName, PWCHAR pDomainName ) { HKEY ServerHandle, UCHandle; PWCHAR ServerName = NULL; USERCONFIG UserConfig; LONG Error; BOOLEAN fFound; WCHAR UserNameTemp[ USERNAME_LENGTH + 1 ]; ULONG Index; WCHAR ComputerName[ _COMPUTERNAME_LENGTH + 1 ]; ULONG CNLength = sizeof(ComputerName)/sizeof( WCHAR ); if ( !GetComputerName( ComputerName, &CNLength ) ) { Error = ERROR_NOT_ENOUGH_MEMORY; } if ( !wcscmp( pDomainName, ComputerName ) ) { ServerName = NULL; } else { PWCHAR ServerNameTemp = NULL; /* * Get the Server Name of the PDC */ Error = NetGetDCName( NULL, pDomainName, (LPBYTE *)&ServerNameTemp ); if ( Error != ERROR_SUCCESS ) { ErrorPrintf(IDS_ERR_GET_PDC, pDomainName, Error ); goto exit; } wcscpy( ComputerName, ServerNameTemp ); NetApiBufferFree( ServerNameTemp ); ServerName = ComputerName; } #ifdef DEBUG fprintf( stderr, "Using server %ws as PDC for Domain %ws\n", ServerName ? ServerName : ComputerName, pDomainName ); #endif /* * Connect to registry of the PDC. */ if ( (Error = RegConnectRegistry( ServerName, HKEY_LOCAL_MACHINE, &ServerHandle )) != ERROR_SUCCESS ) { ErrorPrintf(IDS_ERR_CONNECT_REG, Error ); goto exit; } /* * Open the UserConfiguration key */ if ( (Error = RegOpenKeyEx( ServerHandle, USERCONFIG_REG_NAME, 0, KEY_READ, &UCHandle )) != ERROR_SUCCESS ) { ErrorPrintf(IDS_ERR_OPEN_KEY, Error ); goto cleanupregconnect; } fFound = FALSE; for ( Index = 0 ; ; Index++ ) { ULONG UCLength; /* * Enumerate next subkey - which is a user name */ if ((Error = RegEnumKey( UCHandle, Index, UserNameTemp, sizeof(UserNameTemp)/sizeof(WCHAR))) != ERROR_SUCCESS ) { if ( Error != ERROR_NO_MORE_ITEMS ) { ErrorPrintf(IDS_ERR_ENUM_KEY, Error ); break; } Error = ERROR_SUCCESS; break; } /* * Get the configuration - it may already be in the SAM. * The Query API is designed to look in the SAM first and then * the Registry. */ if ( !pUserName ) { Print(IDS_CONVERTING, UserNameTemp ); UCLength = sizeof( UserConfig ); Error = RegUserConfigQuery( ServerName, UserNameTemp, &UserConfig, sizeof( UserConfig ), &UCLength ); if ( Error != ERROR_SUCCESS ) { Print( IDS_ERR_QUERY_CONFIG, Error ); break; } /* * Store the configuration in the SAM. */ Error = RegUserConfigSet( ServerName, UserNameTemp, &UserConfig, sizeof(UserConfig) ); if ( Error != ERROR_SUCCESS ) { Print( IDS_ERR_SET_CONFIG, Error ); } else { Print( IDS_COMPLETE ); } } else if ( !wcscmp( pUserName, UserNameTemp ) ) { Print( IDS_CONVERTING, UserNameTemp ); fFound = TRUE; UCLength = sizeof( UserConfig ); Error = RegUserConfigQuery( ServerName, UserNameTemp, &UserConfig, sizeof( UserConfig ), &UCLength ); if ( Error != ERROR_SUCCESS ) { Print( IDS_ERR_QUERY_CONFIG2, Error ); break; } /* * Store the configuration in the SAM. */ Error = RegUserConfigSet( ServerName, UserNameTemp, &UserConfig, sizeof(UserConfig) ); if ( Error != ERROR_SUCCESS ) { Print( IDS_ERR_SET_CONFIG, Error ); } else { Print(IDS_COMPLETE); } break; } } /* * If a name was given and it wasn't found, then say so. */ if ( !Error && !fFound && pUserName ) { ErrorPrintf(IDS_ERR_USER_NOT_FOUND, pUserName ); } /* * Close UserConfiguration key */ RegCloseKey( UCHandle ); cleanupregconnect: /* * Close connection to Registry on PDC */ RegCloseKey( ServerHandle ); exit: return( Error == ERROR_SUCCESS ); } __cdecl main( int argc, char *argv[] ) { if ( !ProcessCommandLine( argc, argv ) ) { return( 1 ); } if ( !ConvertUserConfiguration( fAll ? NULL : UserName, DomainName ) ) { return( 1 ); } } /******************************************************************************* * * print * Display a message to stdout with variable arguments. Message * format string comes from the application resources. * * ENTRY: * nResourceID (input) * Resource ID of the format string to use in the message. * ... (input) * Optional additional arguments to be used with format string. * * EXIT: * ******************************************************************************/ void Print( int nResourceID, ... ) { char sz1[256], sz2[512]; va_list args; va_start( args, nResourceID ); if ( LoadStringA( NULL, nResourceID, sz1, 256 ) ) { vsprintf( sz2, sz1, args ); printf( sz2 ); } va_end(args); }