2011-04-08 5 views
1

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); 
    } 
} 

답변

2

. 가이드는 herehere입니다. 희망이 도움이됩니다.

관련 문제