//#-------------------------------------------------------------- // // File: shortcut.cpp // // Synopsis: Implementation the custom action to add/remove the // "Remote Administration Tools" to/from the start menu // // Copyright (C) Microsoft Corporation. All rights reserved. // //---------------------------------------------------------------- #include "precomp.h" #include #include #include #include #include #include #undef _ATL_NO_DEBUG_CRT #include // // Web Interface for Remote Administration // Manage a Web or file server using a Web browser interface // using namespace std; // // Constants for creating a shortcut to the Administration site // WCHAR SHORTCUT_EXT [] = L".lnk"; WCHAR SECURELAUNCH_PATH [] = L"\\ServerAppliance\\SecureLaunch.vbs"; WCHAR WSCRIPT_PATH[] = L"\\wscript.exe"; // // note - the following is just a file name and does not need to be localized // WCHAR SHORTCUT_FILE_NAME [] = L"Remote Administration Tools"; WCHAR RESOURCE_FILE_NAME [] = L"\\sainstall.dll"; WCHAR SYSTEM_32_PATH [] = L"%systemroot%\\system32"; //++-------------------------------------------------------------- // // Function: CreateSAKShortcut // // Synopsis: This is export function to add "Remote Administration Tools" shortcut // to the start menu // // Arguments: // [in] HANDLE - handle passed in by MSI // // Returns: DWORD - success/failure // // History: MKarki Created 12/04/2002 // //---------------------------------------------------------------- DWORD __stdcall CreateSAKShortcut ( /*[in]*/ MSIHANDLE hInstall ) { CSATraceFunc objTraceFunc ("CreateSAKShortCut"); DWORD dwRetVal = -1; do { // // Get the path to %System32% // WCHAR pwsSystemPath[MAX_PATH+1]; HRESULT hr = SHGetFolderPath( NULL, CSIDL_SYSTEM, NULL, SHGFP_TYPE_CURRENT, pwsSystemPath); if (FAILED(hr)) { SATracePrintf ("SHGetFolderPath failed getting the System32 path with error:%x", hr); OutputDebugString (L"SHGetFolderPath failed getting the System32 path with error\n"); break; } // // Construct the path to wscript.exe // wstring wsWScriptPath(pwsSystemPath); wsWScriptPath += WSCRIPT_PATH; SATracePrintf ("WScript Path = %ws", wsWScriptPath.data()); // // Construct the path to SecureLaunch.vbs // wstring wsLaunchPath(pwsSystemPath); wsLaunchPath += SECURELAUNCH_PATH; SATracePrintf ("Secure Launch Path = %ws", wsLaunchPath.data()); // //Construct the path where the shortcut will be stored in the Startup folder // // //Get the path to the Administrators Tools folder // WCHAR pwsStartMenuPath[MAX_PATH+1]; hr = SHGetFolderPath(NULL, CSIDL_COMMON_ADMINTOOLS, NULL, SHGFP_TYPE_CURRENT, pwsStartMenuPath); if (FAILED(hr)) { SATracePrintf ("SHGetFolderPath failed getting the Start Menu path with error:%x", hr); OutputDebugString (L"SHGetFolderPath failed getting the System32 path with error"); break; } wstring wsPathLink(pwsStartMenuPath); wsPathLink += L"\\"; wsPathLink += SHORTCUT_FILE_NAME; wsPathLink += SHORTCUT_EXT; SATracePrintf(" PathLink = %ws", wsPathLink.data()); // // Now that the shortcut information has been constructed, // create the shortcut object. // CComPtr psl; // // Get a pointer to the IShellLink interface. // hr = CoCreateInstance ( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl); if (FAILED(hr)) { SATracePrintf ("ShellLink CoCreateInstance Failed with error:%x",hr); OutputDebugString (L"ShellLink CoCreateInstance Failed"); break; } WCHAR wszShortcutResourceID [MAX_PATH +1]; _itow (IDS_SAK_SHORTCUT_DESCRIPTION, wszShortcutResourceID, 10); wstring wsShortcutDescription (L"@"); wsShortcutDescription += pwsSystemPath; wsShortcutDescription += RESOURCE_FILE_NAME; wsShortcutDescription += L",-"; wsShortcutDescription += wszShortcutResourceID; SATracePrintf ("ShortCut Description:%ws", wsShortcutDescription.data ()); // // Set the information for the shortcut // psl->SetPath(wsWScriptPath.data()); psl->SetArguments(wsLaunchPath.data()); psl->SetDescription(wsShortcutDescription.data ()); // // the following really doesn't get the icon - because there is no icon in this DLL // it is too late to add an icon for .NET Server // psl->SetIconLocation(L"sasetupca.dll", 0); SATraceString ("Saving shortcut to file"); // // Query IShellLink for the IPersistFile interface for saving the // shortcut in persistent storage. // CComPtr ppf; hr = psl->QueryInterface( IID_IPersistFile, (LPVOID*)&ppf ); if (FAILED(hr)) { SATracePrintf ("QueryInterface failed for IPersistFile with error:%x",hr); OutputDebugString (L"QueryInterface failed for IPersistFile\n"); break; } SATraceString ("Pointer to IPersistFile retrieved"); // // Save the link by calling IPersistFile::Save. // hr = ppf->Save(wsPathLink.data(), TRUE); if (FAILED(hr)) { SATracePrintf ("Failed to save shortcut with error:%x", hr); OutputDebugString (L"Failed to save shortcut\n"); break; } SATraceString ("Successfully saved shortcut"); OutputDebugString (L"Successfully saved shortcut"); wstring wsLocalizedFileNameResource (SYSTEM_32_PATH); wsLocalizedFileNameResource += RESOURCE_FILE_NAME; // // set the localized name of the shortcut // hr = SHSetLocalizedName ( (LPWSTR) wsPathLink.data (), wsLocalizedFileNameResource.data (), IDS_SAK_SHORTCUT_NAME ); if (FAILED (hr)) { SATracePrintf ("Failed on SHSetLocalizedFilaName with error:%x", hr); OutputDebugString (L"Failed on SHSetLocalizedFilaName"); break; } SATraceString ("Successfully created shortcut"); OutputDebugString (L"Successfully created shortcut"); // // done creating the shortcut // dwRetVal = ERROR_SUCCESS; } while (false); return (dwRetVal); } // end of CreateSAKShortcut function //++-------------------------------------------------------------- // // Function: RemoveSAKShortcut // // Synopsis: This is export function to remove "Remote Administration Tools" shortcut // to the start menu // // Arguments: // [in] HANDLE - handle passed in by MSI // // Returns: DWORD - success/failure // // History: MKarki Created 12/04/2002 // //---------------------------------------------------------------- DWORD __stdcall RemoveSAKShortcut ( /*[in]*/ MSIHANDLE hInstall ) { CSATraceFunc objTraceFunc ("RemoveSAKShortcut"); DWORD dwRetVal = -1; do { // //Construct the path where the shortcut will be stored in the Startup folder // // //Get the path to the Administrators Tools folder // WCHAR pwsStartMenuPath[MAX_PATH +1]; HRESULT hr = SHGetFolderPath(NULL, CSIDL_COMMON_ADMINTOOLS, NULL, SHGFP_TYPE_CURRENT, pwsStartMenuPath); if (FAILED(hr)) { SATracePrintf ("SHGetFolderPath failed getting the Start Menu path with error:%x", hr); break; } wstring wsPathLink(pwsStartMenuPath); wsPathLink += L"\\"; wsPathLink += SHORTCUT_FILE_NAME; wsPathLink += SHORTCUT_EXT; SATracePrintf(" PathLink = %ws", wsPathLink.data()); // // delete the shortcut now - // BOOL bRetVal = DeleteFile (wsPathLink.data ()); if (FALSE == bRetVal) { SATracePrintf ("Failed to Delete File with error:%x", GetLastError ()); break; } // // success // dwRetVal = ERROR_SUCCESS; } while (false); return (dwRetVal); } // end of RemoveSAKShortcut function