tl/dr : 현재 서비스에 로그인 한 사용자로 프로그램을 실행하는 방법을 찾고 있습니다. Local System Account
으로 시작되었습니다.로컬 시스템 계정으로 시작된 서비스에서 로그인 한 사용자로 프로그램을 실행하십시오.
긴 버전 :
부터 후속 : Get current username from a program started as Local System Account
내 프로그램은 Local System Account
으로 실행되는 서비스에서 시작됩니다.
이 서비스는 Windows 시작 시간에 시작되며 기본적으로 일부 하드웨어 버튼에 기능을 제공합니다. 화면 키보드를 표시합니다. 내 프로그램도 단추 중 하나에 할당되지만 실제 사용자가 로그인 한 경우에만 사용할 수 있습니다.
하드웨어 카메라를 사용하여 사진을 찍고 파일 시스템의 어딘가에 저장하면, 잘 작동하지만 네트워크 경로에 사진을 저장할 수는 없습니다. 이해할 수있는 것은 인증을 요구하기 때문입니다.
로그인 한 사용자로 프로그램을 직접 시작하면이 인증을 사용할 수 있으며 네트워크 경로에 파일을 저장하면 문제가 없습니다.
이 문제를 해결할 수있는 방법이 있습니까?
내 선호하는 솔루션은 어딘가에 암호와 사용자 이름을 저장하지 않고 현재 로그인 한 사용자로 프로그램을 시작하는 것입니다. 다른 사이트에서 발견
근무 솔루션 : 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 기능 :
당신이CreateProcessAsUser
를 사용할 필요가
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);
}
}