2011-04-08 4 views
1

tl/dr: Je suis à la recherche d'un moyen d'exécuter un programme en tant qu'utilisateur actuellement connecté à partir d'un service qui est commencé comme Local System Account.À partir d'un service démarré en tant que compte système local, exécutez un programme en tant qu'utilisateur connecté


Version longue:

le suivi de: Get current username from a program started as Local System Account

Mon programme est lancé à partir d'un service qui fonctionne comme Local System Account.

Ce service est démarré au démarrage de Windows et fournit essentiellement des fonctionnalités à certains boutons matériels, par ex. afficher un clavier à l'écran. Mon programme est également affecté à l'un des boutons, mais il n'est disponible que lorsqu'un utilisateur est connecté.

Ce qu'il fait est de prendre une photo en utilisant une caméra matérielle et de la stocker quelque part sur le système de fichiers, ce qui fonctionne bien, mais je ne peux pas stocker des images sur un chemin réseau, ce qui est compréhensible, car cela nécessite une authentification.

Si le programme est démarré directement en tant qu'utilisateur connecté, cette authentification est disponible et le stockage de fichiers sur un chemin réseau fonctionne correctement.

Existe-t-il un moyen de résoudre ce problème?

Ma solution préférée serait de démarrer le programme en tant qu'utilisateur qui est actuellement connecté sans stocker le mot de passe et le nom d'utilisateur quelque part.

solution de travail trouvée sur un autre site: 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") 

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

Répondre

2

vous devez utiliser CreateProcessAsUser. Un guide peut être trouvé here et here. J'espère que cela t'aides.

Questions connexes