
Новичок
Профиль
Группа: Awaiting Authorisation
Сообщений: 48
Регистрация: 24.11.2004
Репутация: нет Всего: нет
|
Народ, нужна помощь ! Давно искал решение, как удалить данные автозаполнения форм и паролей в IE не используя сервер. Нашёл, подсказали на другом форуме. Но есть проблема, он на C++. Кто-нить может на Delphi переделать ? А то с C++ я не слишком дружу Вот исходник: Код | switch m_dwClearSettings case CLEAR_AUTOCOMPLETE_FORMS { if (IsWindows2k() || IsWindowsNT()) { CString sBaseKey; SECURITY_DESCRIPTOR NewSD; BYTE* pOldSD; PACL pDacl = NULL; PSID pSid = NULL; TCHAR szSid[256]; if (GetUserSid(&pSid)) { //get the hiden key name GetSidString(pSid, szSid);
sKey = _T("Software\\Microsoft\\Protected Storage System Provider\\"); sKey += szSid;
//get old SD sBaseKey = sKey; GetOldSD(HKEY_CURRENT_USER, sBaseKey, &pOldSD);
//set new SD and then clear if (CreateNewSD(pSid, &NewSD, &pDacl)) { RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, FALSE);
sKey += _T("\\Data"); RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, FALSE);
sKey += _T("\\e161255a-37c3-11d2-bcaa-00c04fd929db"); RegSetPrivilege(HKEY_CURRENT_USER, sKey, &NewSD, TRUE);
dwRet = SHDeleteKey(HKEY_CURRENT_USER, sKey); }
if (pDacl != NULL) HeapFree(GetProcessHeap(), 0, pDacl);
//restore old SD if (pOldSD) { RegSetPrivilege(HKEY_CURRENT_USER, sBaseKey, (SECURITY_DESCRIPTOR*)pOldSD, FALSE); delete pOldSD; } } if (pSid) HeapFree(GetProcessHeap(), 0, pSid); }
//win9x DWORD dwSize = MAX_PATH; TCHAR szUserName[MAX_PATH]; GetUserName(szUserName, &dwSize);
sKey = _T("Software\\Microsoft\\Protected Storage System Provider\\"); sKey += szUserName; sKey += _T("\\Data\\e161255a-37c3-11d2-bcaa-00c04fd929db"); dwRet = SHDeleteKey(HKEY_LOCAL_MACHINE, sKey); }
case CLEAR_AUTOCOMPLETE_PWDS { SHDeleteKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\IntelliForms")); } } // Helper functions for the above code... BOOL GetUserSid(PSID* ppSid) { HANDLE hToken; BOOL bRes; DWORD cbBuffer, cbRequired; PTOKEN_USER pUserInfo;
// The User's SID can be obtained from the process token bRes = OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken); if (FALSE == bRes) { return FALSE; }
// Set buffer size to 0 for first call to determine // the size of buffer we need. cbBuffer = 0; bRes = GetTokenInformation(hToken, TokenUser, NULL, cbBuffer, &cbRequired); if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { return FALSE; }
// Allocate a buffer for our token user data cbBuffer = cbRequired; pUserInfo = (PTOKEN_USER) HeapAlloc(GetProcessHeap(), 0, cbBuffer); if (NULL == pUserInfo) { return FALSE; }
// Make the "real" call bRes = GetTokenInformation(hToken, TokenUser, pUserInfo, cbBuffer, &cbRequired); if (FALSE == bRes) { return FALSE; }
// Make another copy of the SID for the return value cbBuffer = GetLengthSid(pUserInfo->User.Sid);
*ppSid = (PSID) HeapAlloc(GetProcessHeap(), 0, cbBuffer); if (NULL == *ppSid) { return FALSE; }
bRes = CopySid(cbBuffer, *ppSid, pUserInfo->User.Sid); if (FALSE == bRes) { HeapFree(GetProcessHeap(), 0, *ppSid); return FALSE; }
bRes = HeapFree(GetProcessHeap(), 0, pUserInfo);
return TRUE; }
void GetSidString(PSID pSid, LPTSTR szBuffer) { //convert SID to string SID_IDENTIFIER_AUTHORITY *psia = ::GetSidIdentifierAuthority( pSid ); DWORD dwTopAuthority = psia->Value[5]; _stprintf(szBuffer, _T("S-1-%lu"), dwTopAuthority);
TCHAR szTemp[32]; int iSubAuthorityCount = *(GetSidSubAuthorityCount(pSid)); for (int i = 0; i<iSubAuthorityCount; i++) { DWORD dwSubAuthority = *(GetSidSubAuthority(pSid, i)); _stprintf(szTemp, _T("%lu"), dwSubAuthority); _tcscat(szBuffer, _T("-")); _tcscat(szBuffer, szTemp); } }
BOOL IsWindowsNT() { BOOL bRet = FALSE; BOOL bOsVersionInfoEx; OSVERSIONINFOEX osvi;
// Try calling GetVersionEx using the OSVERSIONINFOEX structure, // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) return bRet; }
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion <= 4) { bRet = TRUE; }
return bRet; }
BOOL IsWindows2k() { BOOL bRet = FALSE; BOOL bOsVersionInfoEx; OSVERSIONINFOEX osvi;
// Try calling GetVersionEx using the OSVERSIONINFOEX structure, // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) return bRet; }
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 5) { bRet = TRUE; }
return bRet; }
BOOL CGlobal::GetOldSD(HKEY hKey, LPCTSTR pszSubKey, BYTE** pSD) { BOOL bRet = FALSE; HKEY hNewKey = NULL; DWORD dwSize = 0; LONG lRetCode; *pSD = NULL;
lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, READ_CONTROL, &hNewKey); if(lRetCode != ERROR_SUCCESS) goto cleanup;
lRetCode = RegGetKeySecurity(hNewKey, (SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, *pSD, &dwSize); if (lRetCode == ERROR_INSUFFICIENT_BUFFER) { *pSD = new BYTE[dwSize]; lRetCode = RegGetKeySecurity(hNewKey, (SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, *pSD, &dwSize); if(lRetCode != ERROR_SUCCESS) { delete *pSD; *pSD = NULL; goto cleanup; } } else if (lRetCode != ERROR_SUCCESS) goto cleanup;
bRet = TRUE; // indicate success
cleanup: if (hNewKey) { RegCloseKey(hNewKey); } return bRet; }
BOOL CGlobal::CreateNewSD(PSID pSid, SECURITY_DESCRIPTOR* pSD, PACL* ppDacl) { BOOL bRet = FALSE; PSID pSystemSid = NULL; SID_IDENTIFIER_AUTHORITY sia = SECURITY_NT_AUTHORITY; ACCESS_ALLOWED_ACE* pACE = NULL; DWORD dwAclSize; DWORD dwAceSize;
// prepare a Sid representing local system account if(!AllocateAndInitializeSid(&sia, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid)) { goto cleanup; }
// compute size of new acl dwAclSize = sizeof(ACL) + 2 * (sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD)) + GetLengthSid(pSid) + GetLengthSid(pSystemSid);
// allocate storage for Acl *ppDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize); if(*ppDacl == NULL) goto cleanup;
if(!InitializeAcl(*ppDacl, dwAclSize, ACL_REVISION)) goto cleanup;
// if(!AddAccessAllowedAce(pDacl, ACL_REVISION, KEY_WRITE, pSid)) // goto cleanup;
// add current user dwAceSize = sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(pSid); pACE = (ACCESS_ALLOWED_ACE *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwAceSize);
pACE->Mask = KEY_READ | KEY_WRITE | KEY_ALL_ACCESS; pACE->Header.AceType = ACCESS_ALLOWED_ACE_TYPE; pACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE; pACE->Header.AceSize = dwAceSize; memcpy(&pACE->SidStart, pSid, GetLengthSid(pSid)); if (!AddAce(*ppDacl, ACL_REVISION, MAXDWORD, pACE, dwAceSize)) goto cleanup; // add local system account HeapFree(GetProcessHeap(), 0, pACE); pACE = NULL; dwAceSize = sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) + GetLengthSid(pSystemSid); pACE = (ACCESS_ALLOWED_ACE *)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwAceSize);
pACE->Mask = KEY_READ | KEY_WRITE | KEY_ALL_ACCESS; pACE->Header.AceType = ACCESS_ALLOWED_ACE_TYPE; pACE->Header.AceFlags = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE; pACE->Header.AceSize = dwAceSize; memcpy(&pACE->SidStart, pSystemSid, GetLengthSid(pSystemSid)); if (!AddAce(*ppDacl, ACL_REVISION, MAXDWORD, pACE, dwAceSize)) goto cleanup;
if(!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION)) goto cleanup;
if(!SetSecurityDescriptorDacl(pSD, TRUE, *ppDacl, FALSE)) goto cleanup; bRet = TRUE; // indicate success
cleanup: if(pACE != NULL) HeapFree(GetProcessHeap(), 0, pACE); if(pSystemSid != NULL) FreeSid(pSystemSid);
return bRet; }
BOOL CGlobal::RegSetPrivilege(HKEY hKey, LPCTSTR pszSubKey, SECURITY_DESCRIPTOR* pSD, BOOL bRecursive) { BOOL bRet = FALSE; HKEY hSubKey = NULL; LONG lRetCode; LPTSTR pszKeyName = NULL;; DWORD dwSubKeyCnt; DWORD dwMaxSubKey; DWORD dwValueCnt; DWORD dwMaxValueName; DWORD dwMaxValueData; DWORD i;
if (!pszSubKey) goto cleanup;
// open the key for WRITE_DAC access lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, WRITE_DAC, &hSubKey); if(lRetCode != ERROR_SUCCESS) goto cleanup;
// apply the security descriptor to the registry key lRetCode = RegSetKeySecurity(hSubKey, (SECURITY_INFORMATION)DACL_SECURITY_INFORMATION, pSD); if( lRetCode != ERROR_SUCCESS ) goto cleanup;
if (bRecursive) { // reopen the key for KEY_READ access RegCloseKey(hSubKey); hSubKey = NULL; lRetCode = RegOpenKeyEx(hKey, pszSubKey, 0, KEY_READ, &hSubKey); if(lRetCode != ERROR_SUCCESS) goto cleanup;
// first get an info about this subkey ... lRetCode = RegQueryInfoKey(hSubKey, 0, 0, 0, &dwSubKeyCnt, &dwMaxSubKey, 0, &dwValueCnt, &dwMaxValueName, &dwMaxValueData, 0, 0); if( lRetCode != ERROR_SUCCESS ) goto cleanup;
// enumerate the subkeys and call RegTreeWalk() recursivly pszKeyName = new TCHAR [MAX_PATH + 1]; for (i=0; i<dwSubKeyCnt; i++) { lRetCode = RegEnumKey(hSubKey, i, pszKeyName, MAX_PATH + 1); if(lRetCode == ERROR_SUCCESS) { RegSetPrivilege(hSubKey, pszKeyName, pSD, TRUE); } else if(lRetCode == ERROR_NO_MORE_ITEMS) { break; } } delete [] pszKeyName; }
bRet = TRUE; // indicate success
cleanup: if (hSubKey) { RegCloseKey(hSubKey); } return bRet; }
|
|