在Windows服务程序中操作HKEY_CURRENT_USER注册表

在Windows服务程序中操作HKEY_CURRENT_USER注册表

2023年6月23日发(作者:)

在Windows服务程序中操作HKEY_CURRENT_USER注册表在服务程序中想要对注册表HKEY_CURRENT_USER下的内容进⾏读写,不会返回失败,但是始终⽆效。原因是:1.服务运⾏在系统权限之下,⽽不是任何⼀个⽤户_CURRENT_USER存储的是当前⽤户的信息================>导致在服务中读取HKEY_CURRENT_USER实际操作的不是当前登录的⽤户的数据。所以如果我要操作HKEY_CURRENT_USER之内的键值,就必须模拟当前⽤户去读取。有⼏种思路可以做到:1.创建⼀个⽤户进程去操作注册表,使⽤CreateProcessAsUser函数可以做到2.让当前线程模拟当前登录⽤户的安全上下⽂(lets the calling thread impersonate the of a logged-on user)。使⽤ImpersonateLoggedOnUser 函数可以做到。第⼀个⽅法需要⽤到另外⼀个程序,感觉⽐较⿇烦。以下演⽰第⼆种⽅法:

BOOL GetTokenByName(HANDLE &hToken,LPTSTR lpName){ if (!lpName) return FALSE; HANDLE hProcessSnap = NULL;

BOOL bRet = FALSE;

PROCESSENTRY32 pe32 = {0};

hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hProcessSnap == INVALID_HANDLE_VALUE)

return (FALSE);

= sizeof(PROCESSENTRY32);

if (Process32First(hProcessSnap, &pe32))

{

do { if(!_tcscmp(_tcsupr(ile),_tcsupr(lpName))) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,32ProcessID); bRet = OpenProcessToken(hProcess,TOKEN_ALL_ACCESS,&hToken); CloseHandle (hProcess);

CloseHandle (hProcessSnap);

return (bRet); } } while (Process32Next(hProcessSnap, &pe32));

bRet = FALSE;

}

else

{ bRet = FALSE; } CloseHandle (hProcessSnap);

return (bRet);}////获取⽤户sid//bool GetAccountSid(LPTSTR AccountName, PSID *Sid){ PSID pSID = NULL; DWORD cbSid = 0; LPTSTR DomainName = NULL; DWORD cbDomainName = 0; SID_NAME_USE SIDNameUse; BOOL bDone = FALSE; try { if(!LookupAccountName(NULL, AccountName, pSID, &cbSid, DomainName, &cbDomainName, &SIDNameUse)) { pSID = (PSID)malloc(cbSid); DomainName = (LPTSTR)malloc(cbDomainName * sizeof(TCHAR)); if(!pSID || !DomainName) { throw; } if(!LookupAccountName(NULL, AccountName, pSID, &cbSid, DomainName, &cbDomainName, &SIDNameUse)) { throw; } bDone = TRUE; } } catch(...) { //nothing } if(DomainName) { free(DomainName); } if(!bDone && pSID) { free(pSID); } if(bDone) { *Sid = pSID; } return bDone;}// 模拟当前⽤户环境设置默认打印机void SimulateCurrentUserSetDefaultPrinter(){ HANDLE hToken = NULL; do

{ if (!GetTokenByName(hToken,_T(""))) { break; } // 模拟登录⽤户的安全上下⽂ if(FALSE == ImpersonateLoggedOnUser(hToken)) { break; } // 获取⽤户名 TCHAR szUsername[MAX_PATH]; DWORD dwUsernameLen = MAX_PATH; if(FALSE == GetUserName(szUsername, &dwUsernameLen)) break; // 到这⾥已经模拟完了,别忘记返回原来的安全上下⽂ if(FALSE == RevertToSelf()) break; // 获取sid PSID pSid = NULL; LPWSTR sid; GetAccountSid(szUsername, &pSid); //获取得到的是⼀个结构体 ConvertSidToStringSid(pSid, &sid); //从结构体中得到sid串 // 设置默认打印机信息 //SetDefaultPrinter(PSSD_PRINTER_NAME); HKEY hKey; int i=0; //操作结果:0==succeed wchar_t lswRegValue[MAX_PATH]; StringCchPrintf(lswRegValue, MAX_PATH, L"%s,winspool,%s", PSSD_PRINTER_NAME, PSSD_PRINTER_PORT_NAME); wchar_t lswKeyPath[MAX_PATH] = {0}; StringCchPrintf(lswKeyPath, MAX_PATH, L"%sSoftwareMicrosoftWindows NTCurrentVersionWindows", sid); if(RegOpenKeyEx(HKEY_USERS, lswKeyPath, 0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) { if(RegSetValueEx(hKey,L"Device",NULL,REG_SZ, (const LPBYTE)lswRegValue, (wcslen(lswRegValue) + 1) * sizeof(wchar_t))!=ERROR_SUCCESS) { i=1; } RegCloseKey(hKey); } else { i=1; } if(1 == i) { OutputDebugStringW(L"STST: 设置默认打印机失败"); } else { SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0); } } while (false); if(NULL != hToken) CloseHandle(hToken);}

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1687516341a16242.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信