从以本地系统帐户启动的服务中,以login用户身份运行程序

tl / dr:我正在寻找一种方式来运行一个程序作为当前login的用户从一个作为Local System Account启动的服务Local System Account


长版本:

跟进: 从以本地系统帐户启动的程序获取当前用户名

我的程序是从作为Local System Account运行的服务启动的。

该服务在Windows启动时启动,基本上为一些硬件button提供function,例如显示屏幕上的键盘。 我的程序也被分配到其中一个button,但只有在实际用户login时才可用。

它所做的就是使用硬件摄像头拍照并将其存储在文件系统的某个位置,但是我无法将图片存储在networkingpath中,这是可以理解的,因为这样做需要进行身份validation。

如果程序以login用户身份直接启动,则此身份validation可用,并且将文件存储在networkingpath中可以正常工作。

有什么办法可以解决这个问题吗?

我的首选解决scheme是以当前login的用户身份启动程序,而不必在某处存储密码和用户名。

在另一个网站上find工作解决scheme: http : //chabster.blogspot.com/2008/01/run-as-interactive-user-from-service.html

stdafx.h中:

 #include <WtsApi32.h> #pragma comment(lib, "WtsApi32.lib") #include <Userenv.h> #pragma comment(lib, "Userenv.lib") 

RunAsInteractiveUser函数:

 BOOL bRet; HRESULT hr; HANDLE processToken = NULL; TOKEN_PRIVILEGES oldTokenPrivileges = { 0 }; HANDLE impersonationToken = NULL; HANDLE userToken = NULL; LPVOID pEnvironment = NULL; PROCESS_INFORMATION processInformation = { 0 }; __try { bRet = OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &processToken); if (!bRet) { hr = GetLastError(); return hr; } // This step might not be necessary because // SeTcbPrivilege is enabled by default for Local System LUID luid; bRet = LookupPrivilegeValue(NULL, _T("SeTcbPrivilege"), &luid); if (!bRet) { hr = GetLastError(); return hr; } TOKEN_PRIVILEGES adjTokenPrivileges = { 0 }; adjTokenPrivileges.PrivilegeCount = 1; adjTokenPrivileges.Privileges[0].Luid = luid; adjTokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; DWORD dwOldTPLen; bRet = AdjustTokenPrivileges(processToken, FALSE, &adjTokenPrivileges, sizeof(TOKEN_PRIVILEGES), &oldTokenPrivileges, &dwOldTPLen); if (bRet) { hr = GetLastError(); if (hr == ERROR_SUCCESS); else if (hr == ERROR_NOT_ALL_ASSIGNED) { // Enabled by default } } else { hr = GetLastError(); return hr; } DWORD conSessId = WTSGetActiveConsoleSessionId(); if (conSessId == 0xFFFFFFFF) { // There is no session attached to the console return ERROR_SUCCESS; } bRet = WTSQueryUserToken(conSessId, &impersonationToken); if (!bRet) { hr = GetLastError(); return hr; } bRet = DuplicateTokenEx(impersonationToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &userToken); if (!bRet) { hr = GetLastError(); return hr; } STARTUPINFO si = { 0 }; si.cb = sizeof(STARTUPINFO); si.lpDesktop = _T("winsta0\\default"); bRet = CreateEnvironmentBlock(&pEnvironment, userToken, TRUE); if (!bRet) { hr = GetLastError(); return hr; } bRet = CreateProcessAsUser(userToken, _T("C:\\Windows\\notepad.exe"), NULL, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, pEnvironment, NULL, &si, &processInformation); if (!bRet) { hr = GetLastError(); return hr; } } __finally { if (processInformation.hThread) { CloseHandle(processInformation.hThread); } if (processInformation.hProcess) { CloseHandle(processInformation.hProcess); } if (pEnvironment) { bRet = DestroyEnvironmentBlock(pEnvironment); } if (userToken) { CloseHandle(userToken); } if (impersonationToken) { CloseHandle(impersonationToken); } if (processToken) { bRet = AdjustTokenPrivileges(processToken, FALSE, &oldTokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL); CloseHandle(processToken); } } 

你必须使用CreateProcessAsUser 。 一个指南可以在这里和这里找到。 希望这可以帮助。