/**************************************************************************** // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright (c) Microsoft Corporation. All rights reserved. File: AzMigrate.cpp Abstract: Defines the entry point for the console application. History: ****************************************************************************/ #include "stdafx.h" #include "AzMStore.h" #include "Shellapi.h" // Function prototype declarations void DisplayUsage(); void run(); int parseCommandLine(); void DisplayUsage(); /*++ Routine description: This method runs most of the migration code Arguments: NONE Return Value:NONE --*/ void run() { HRESULT hr; CAzMStore sourceStore(CAzGlobalOptions::m_bstrSourceStoreName),destStore(CAzGlobalOptions::m_bstrDestStoreName); hr=sourceStore.InitializeStore(false); if (FAILED(hr)) goto lError1; hr=destStore.InitializeStore(true); if (FAILED(hr)) { if (CAzGlobalOptions::m_bOverWrite==true) { hr=destStore.OverWriteStore(); CAzLogging::Log(hr,_TEXT("Overwriting AzMan Authornization Store"),COLE2T(CAzGlobalOptions::m_bstrDestStoreName)); if (FAILED(hr)) goto lError1; } else { goto lError1; } } if (CAzGlobalOptions::m_bSpecificApp==false) hr=sourceStore.OpenAllApps(); else { for (vector::iterator iter=CAzGlobalOptions::m_bstrAppNames.begin() ; iter !=CAzGlobalOptions::m_bstrAppNames.end() ; iter++) hr=sourceStore.OpenApp(*iter); if (FAILED(hr)) goto lError1; } if (FAILED(hr)) goto lError1; hr=destStore.Copy(sourceStore); lError1: CAzLogging::Close(); } /*++ Routine description: This method parses the command line arguments and sets the appropriate members in the CAzGlobalOptions class Return Value: Returns success - 0 failure - -1 help - 1 --*/ int parseCommandLine() { int iRet = 0; int iNumArgs, iNumToBeProcessed; LPTSTR lpstrCommandArgs=GetCommandLine(); LPTSTR *rgCmdArgs=CommandLineToArgvW(lpstrCommandArgs,&iNumArgs); // To take care of no command line arguments if (iNumArgs <= 1 ) { iRet = -1; goto Cleanup; } // Check if one argument only and that is the /? argument if (0==_tcsncicmp(rgCmdArgs[1],CAzGlobalOptions::HELPTAG , CAzGlobalOptions::HELPTAG_LEN)) { DisplayUsage(); iRet = 1; goto Cleanup; } // if more than one argument but not the required 2 arguments if (iNumArgs < 3 ) { iRet = -1; goto Cleanup; } CAzGlobalOptions::m_bstrDestStoreName.Attach(CComBSTR(rgCmdArgs[1]).Copy()); CAzGlobalOptions::m_bstrSourceStoreName.Attach(CComBSTR(rgCmdArgs[2]).Copy()); CAzGlobalOptions::setDefaults(); iNumToBeProcessed = iNumArgs-3; for (int i = 3 ; i < iNumArgs ; i++) { // Checking for /logfile if (0==_tcsncicmp(rgCmdArgs[i],CAzGlobalOptions::LOGFILETAG,CAzGlobalOptions::LOGFILETAG_LEN)) { _TCHAR *strRightPart=_tcschr(rgCmdArgs[i],_TCHAR('=')); if (NULL==strRightPart) { iRet = -1; goto Cleanup; } CAzLogging::Initialize(CAzLogging::LOG_LOGFILE,&strRightPart[1]); iNumToBeProcessed--; } else if (0==_tcsncicmp(rgCmdArgs[i],CAzGlobalOptions::APPNAMETAG,CAzGlobalOptions::APPNAMETAG_LEN)) { //Checking for /application flag LPTSTR strTmp; _TCHAR *strRightPart=_tcschr(rgCmdArgs[i],_TCHAR('=')); if (NULL==strRightPart) { iRet = -1; goto Cleanup; } CAzGlobalOptions::m_bSpecificApp=true; _TCHAR *strAppNames =_tcstok_s(&strRightPart[1],_TEXT(","),&strTmp); while (strAppNames!=NULL) { CAzGlobalOptions::m_bstrAppNames.push_back(CComBSTR(strAppNames).Copy()); /* While there are tokens in "string" */ /* Get next token: */ strAppNames =_tcstok_s(NULL,_TEXT(","),&strTmp); } iNumToBeProcessed--; } else if (0==_tcsncicmp(rgCmdArgs[i] , CAzGlobalOptions::OVERWRITETAG , CAzGlobalOptions::OVERWRITETAG_LEN)) { //Checking for /overwrite flag CAzGlobalOptions::m_bOverWrite=true; iNumToBeProcessed--; } else if (0==_tcsncicmp(rgCmdArgs[i] , CAzGlobalOptions::IGNOREMEMBERSTAG,CAzGlobalOptions::IGNOREMEMBERSTAG_LEN)) { //Checking for /IGNOREMEMBERS flag CAzGlobalOptions::m_bIgnoreMembers=true; iNumToBeProcessed--; } else if (0==_tcsncicmp(rgCmdArgs[i] , CAzGlobalOptions::IGNOREPOLICYADMINSTAG , CAzGlobalOptions::IGNOREPOLICYADMINSTAG_LEN)) { //Checking for /IGNOREPOLICYADMIN flag CAzGlobalOptions::m_bIgnorePolicyAdmins=true; iNumToBeProcessed--; } else if (0==_tcsncicmp(rgCmdArgs[i] , CAzGlobalOptions::VERBOSETAG , CAzGlobalOptions::VERBOSETAG_LEN)) { CAzGlobalOptions::m_bVerbose=true; CAzLogging::Initialize(CAzLogging::LOG_TRACE); iNumToBeProcessed--; } else if (0==_tcsncicmp(rgCmdArgs[i] , CAzGlobalOptions::HELPTAG , CAzGlobalOptions::HELPTAG_LEN)) { DisplayUsage(); iNumToBeProcessed--; iRet = 1; goto Cleanup; } } // Some additional parameters exist which donot match // hence these are invalid flags. if (0 != iNumToBeProcessed) { iRet = -1; goto Cleanup; } iRet = 0; Cleanup: if (rgCmdArgs) { LocalFree(rgCmdArgs); } return iRet; } /*++ Routine description: This method displays the usage details of the tool Arguments: NONE Return Value: NONE --*/ void DisplayUsage() { wcout << _TEXT("\tAzMigrate [flags]\n") << endl ; wcout << _TEXT("\tFlags:")<