// This is a part of the Microsoft Management Console. // Copyright (C) 1995-2001 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Management Console and related // electronic documentation provided with the interfaces. #include "stdafx.h" #include "afxdlgs.h" #include "cookie.h" #include "snapmgr.h" #include "util.h" #include "servperm.h" #include "addobj.h" #include "wrapper.h" //#include //#include //#include #include #include #include #include static CLIPFORMAT g_cfDsObjectNames = 0; #if USE_DS HRESULT MyDsFindDsObjects( IN LPTSTR pMyScope, OUT PDWORD pCount, OUT LPTSTR **ppSelObjs ); HRESULT MyDsFreeObjectBuffer( IN DWORD nCount, IN LPTSTR *pSelObjs ); #endif // // in snapmgr.cpp // int BrowseCallbackProc(HWND hwnd,UINT uMsg, LPARAM lParam, LPARAM pData); HRESULT CComponentDataImpl::AddAnalysisFolderToList(LPDATAOBJECT lpDataObject, MMC_COOKIE cookie, FOLDER_TYPES folderType) { PEDITTEMPLATE pet = NULL; PSCE_PROFILE_INFO pProfileInfo = NULL; PVOID pHandle = SadHandle; if ( !pHandle ) { return E_INVALIDARG; } // // to select a folder. // BROWSEINFO bi; CString strTitle; LPITEMIDLIST pidlRoot = NULL; if (FAILED(SHGetSpecialFolderLocation(m_hwndParent,CSIDL_DRIVES,&pidlRoot))) { return E_FAIL; } ZeroMemory(&bi,sizeof(bi)); bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_BROWSEINCLUDEFILES | BIF_EDITBOX | BIF_NEWDIALOGSTYLE; bi.lpfn = BrowseCallbackProc; strTitle.LoadString(IDS_ADDFILESANDFOLDERS_TITLE); bi.lpszTitle = strTitle; bi.hwndOwner = m_hwndParent; bi.pidlRoot = pidlRoot; LPITEMIDLIST pidlLocation = NULL; pidlLocation = SHBrowseForFolder(&bi); if (!pidlLocation) { return E_FAIL; } CString strPath; LPMALLOC pMalloc = NULL; SHGetPathFromIDList(pidlLocation,strPath.GetBuffer(MAX_PATH)); strPath.ReleaseBuffer(); if (SUCCEEDED(SHGetMalloc(&pMalloc))) { pMalloc->Free(pidlLocation); pMalloc->Free(pidlRoot); pMalloc->Release(); } HRESULT hr=E_FAIL; if ( strPath.GetLength() ) { PSECURITY_DESCRIPTOR pSelSD=NULL; SECURITY_INFORMATION SelSeInfo = 0; BYTE ConfigStatus = 0; if (GetAddObjectSecurity( m_hwndParent, strPath, TRUE, SE_FILE_OBJECT, pSelSD, SelSeInfo, ConfigStatus ) == E_FAIL) { return hr; } // // only add the object(s) if a security descriptor is selected // if ( pSelSD && SelSeInfo ) { // // add to the engine directly // SCESTATUS sceStatus=SCESTATUS_SUCCESS; BYTE AnalStatus; // // start the transaction if it's not started // if ( EngineTransactionStarted() ) { sceStatus = SceUpdateObjectInfo( pHandle, AREA_FILE_SECURITY, (LPTSTR)(LPCTSTR)strPath, strPath.GetLength(), // number of characters ConfigStatus, TRUE, pSelSD, SelSeInfo, &AnalStatus ); if ( SCESTATUS_SUCCESS == sceStatus && (pet = GetTemplate(GT_COMPUTER_TEMPLATE,AREA_FILE_SECURITY))) { pProfileInfo = pet->pTemplate; // // just free the object list and unmark the area // so when the node is clicked, the profile info // will be reloaded // SceFreeMemory((PVOID)(pProfileInfo->pFiles.pOneLevel), SCE_STRUCT_OBJECT_LIST); pProfileInfo->pFiles.pOneLevel = NULL; pet->ClearArea(AREA_FILE_SECURITY); pet->SetDirty(AREA_FILE_SECURITY); } if ( SCESTATUS_SUCCESS == sceStatus ) { hr = S_OK; } } else { // // transaction can't be started to update the object // hr = E_FAIL; } } // if no SD is selected, the object won't be added if ( pSelSD ) { LocalFree(pSelSD); pSelSD = NULL; } if ( FAILED(hr) ) { CString str; str.LoadString(IDS_CANT_ADD_FOLDER); AfxMessageBox(str); } } // cancel is clicked return hr; } /*------------------------------------------------------------------------------------- Method: CComponentDataImpl::GetAddObjectSecurity Synopsis: Gets security information for files and folders that are begin added. Arguments: [hwndParent] - [in] Parent of the dialogs displayed. [strFile] - [in] File to display in the dialogs. [bContainer] - [in] Container security or not. [pSelSD] - [out] Security descriptor. [SelSeInfo] - [out] Se info. [ConfigStatus] - [out] Status of the configration Returns: S_OK - Operation was successful S_FAIL - Operation was canceled. -------------------------------------------------------------------------------------*/ HRESULT CComponentDataImpl::GetAddObjectSecurity( HWND hwndParent, LPCTSTR strFile, BOOL bContainer, SE_OBJECT_TYPE seType, PSECURITY_DESCRIPTOR &pSelSD, SECURITY_INFORMATION &SelSeInfo, BYTE &ConfigStatus ) { if (!strFile || !lstrlen(strFile)) { return E_FAIL; } // // Default values. // DWORD SDSize; pSelSD = NULL; SelSeInfo = NULL; ConfigStatus = 0; INT_PTR nRet; // // Bring up the ACL editor. // nRet = MyCreateSecurityPage2( bContainer, &pSelSD, &SelSeInfo, (LPCTSTR)strFile, seType, CONFIG_SECURITY_PAGE, hwndParent, FALSE // not modeless ); if (nRet == -1) { if (pSelSD) { LocalFree(pSelSD); pSelSD = NULL; } CString str; str.LoadString(IDS_CANT_ASSIGN_SECURITY); AfxMessageBox(str); return E_FAIL; } if (nRet <= 0) { if (pSelSD) { LocalFree(pSelSD); pSelSD = NULL; } return E_FAIL; } if ( !pSelSD ) { DWORD SDSize; // // if no security is selected, use Everyone Full control // if ( SE_FILE_OBJECT == seType ) { GetDefaultFileSecurity(&pSelSD,&SelSeInfo); } else { GetDefaultRegKeySecurity(&pSelSD,&SelSeInfo); } } // // Bring up the object editor. // CWnd *pWnd = NULL; BOOL bAllocWnd = FALSE; if (hwndParent) { pWnd = CWnd::FromHandlePermanent( hwndParent ); if (pWnd == NULL) { pWnd = new CWnd; if (!pWnd) { if (pSelSD) { LocalFree(pSelSD); pSelSD = NULL; } return E_FAIL; } bAllocWnd = TRUE; pWnd->Attach(hwndParent); } } CAddObject theObjAcl( seType, (LPTSTR)(LPCTSTR)strFile, TRUE, pWnd ); // // CAddObject frees these pointers // theObjAcl.SetSD(pSelSD); pSelSD = NULL; theObjAcl.SetSeInfo(SelSeInfo); SelSeInfo = NULL; CThemeContextActivator activator; nRet = theObjAcl.DoModal(); if (bAllocWnd) { pWnd->Detach(); delete pWnd; } if (nRet == IDOK ) { pSelSD = theObjAcl.GetSD(); SelSeInfo = theObjAcl.GetSeInfo(); ConfigStatus = theObjAcl.GetStatus(); return S_OK; } if ( pSelSD ) { LocalFree(pSelSD); pSelSD = NULL; } return E_FAIL; } HRESULT CComponentDataImpl::AddAnalysisFilesToList(LPDATAOBJECT lpDataObject,MMC_COOKIE cookie, FOLDER_TYPES folderType) { PEDITTEMPLATE pet; PSCE_PROFILE_INFO pProfileInfo; PVOID pHandle = SadHandle; if ( !pHandle ) { return E_INVALIDARG; } HRESULT hr=E_FAIL; // // to select a file. // CFileDialog fd(true, NULL, NULL, OFN_DONTADDTORECENT| OFN_ALLOWMULTISELECT); CThemeContextActivator activator; if (IDOK == fd.DoModal()) { POSITION pos = fd.GetStartPosition(); if ( pos ) { // // if anyone is selected, invoke acl editor // CString strPath = fd.GetNextPathName(pos); if ( strPath.GetLength() ) { PSECURITY_DESCRIPTOR pSelSD=NULL; SECURITY_INFORMATION SelSeInfo = 0; BYTE ConfigStatus = 0; if( GetAddObjectSecurity( m_hwndParent, strPath, TRUE, SE_FILE_OBJECT, pSelSD, SelSeInfo, ConfigStatus ) == E_FAIL ){ return S_OK; } if ( pSelSD && SelSeInfo ) { // // only add the object(s) if a security descriptor is selected // SCESTATUS sceStatus=SCESTATUS_SUCCESS; // // start the transaction if it's not started // if ( EngineTransactionStarted() ) { do { // // add to the engine directly // BYTE AnalStatus; sceStatus = SceUpdateObjectInfo( pHandle, AREA_FILE_SECURITY, (LPTSTR)(LPCTSTR)strPath, strPath.GetLength(), // number of characters ConfigStatus, FALSE, pSelSD, SelSeInfo, &AnalStatus ); if ( SCESTATUS_SUCCESS == sceStatus && (pet = GetTemplate(GT_COMPUTER_TEMPLATE,AREA_FILE_SECURITY))) { pProfileInfo = pet->pTemplate; // // just free the object list and unmark the area // so when the node is clicked, the profile info // will be reloaded // SceFreeMemory((PVOID)(pProfileInfo->pFiles.pOneLevel), SCE_STRUCT_OBJECT_LIST); pProfileInfo->pFiles.pOneLevel = NULL; pet->ClearArea(AREA_FILE_SECURITY); pet->SetDirty(AREA_FILE_SECURITY); } if ( SCESTATUS_SUCCESS != sceStatus ) { CString str; str.LoadString(IDS_SAVE_FAILED); AfxMessageBox(str); break; } } while (pos && (strPath = fd.GetNextPathName(pos)) ); if ( SCESTATUS_SUCCESS == sceStatus ) { hr = S_OK; } } else { // // no transaction is started to update the object // hr = E_FAIL; } } // if no SD is selected, the object won't be added if ( pSelSD ) { LocalFree(pSelSD); pSelSD = NULL; } if ( FAILED(hr) ) { CString str; str.LoadString(IDS_CANT_ADD_FILE); AfxMessageBox(str); } } } } return hr; } HRESULT CComponentDataImpl::UpdateScopeResultObject(LPDATAOBJECT pDataObj, MMC_COOKIE cookie, AREA_INFORMATION area) { PEDITTEMPLATE pet; PSCE_PROFILE_INFO pProfileInfo; if ( !cookie || area != AREA_REGISTRY_SECURITY ) { return E_INVALIDARG; } pet = GetTemplate(GT_COMPUTER_TEMPLATE,area); if ( pet ) { pProfileInfo = pet->pTemplate; // // just free the object list and unmark the area // so when the node is clicked, the profile info // will be reloaded // switch ( area ) { case AREA_REGISTRY_SECURITY: SceFreeMemory((PVOID)(pProfileInfo->pRegistryKeys.pOneLevel), SCE_STRUCT_OBJECT_LIST); pProfileInfo->pRegistryKeys.pOneLevel = NULL; break; case AREA_FILE_SECURITY: SceFreeMemory((PVOID)(pProfileInfo->pFiles.pOneLevel), SCE_STRUCT_OBJECT_LIST); pProfileInfo->pFiles.pOneLevel = NULL; break; default: return E_INVALIDARG; } pet->ClearArea(area); CFolder *pFolder = (CFolder *)cookie; DeleteChildrenUnderNode(pFolder); if ( pFolder->IsEnumerated() ) { pFolder->Set(FALSE); EnumerateScopePane(cookie,pFolder->GetScopeItem()->ID); } pFolder->RemoveAllResultItems(); m_pConsole->UpdateAllViews(NULL,(LONG_PTR)pFolder,UAV_RESULTITEM_UPDATEALL); } return S_OK; }