Domanda

Ho una chiamata da creareProcesswithtokenw che non è in difetto con accesso negato. Qualche idea come eseguire il debug di questo?

La chiamata a creareProcesswithtokenw è qui: https: / /github.com/fschwiet/pshochu/blob/master/pshochu/pinvoke/netwappers/processutil.cs

Per ora sto usando un token di accesso per il processo corrente, alla fine userò un token da un altro utente. Per ora, sto usando https:// GitHub. com / fschwiet / Pshochu / Blob / master / Pshochu / Pinvoke / Netwrappers / AccessToken.cs per ottenere il token di accesso.

Se si desidera eseguire il debug, abbassare il sourcecode ed eseguire build_and_test.ps1. Lo stack di errore è:

1) Test Error : PShochu.Tests.can_run_remote_interactive_tasks, given a psake script which writes the current process id to output, when that script is invoked interactively, then the script succeeds
   System.ComponentModel.Win32Exception : Access is denied
   at PShochu.PInvoke.NetWrappers.ProcessUtil.CreateProcessWithToken(IntPtr userPrincipalToken, String applicationName,
String applicationCommand, Boolean dontCreateWindow, Boolean createWithProfile, StreamReader& consoleOutput, StreamReader& errorOutput) in c:\src\PShochu\PShochu\PInvoke\NetWrappers\ProcessUtil.cs:line 52
   at PShochu.ProcessHandling.RunNoninteractiveConsoleProcessForStreams2(String command, String commandArguments, String& newLine) in c:\src\PShochu\PShochu\ProcessHandling.cs:line 36
   at PShochu.ProcessHandling.RunNoninteractiveConsoleProcess(String command, String commandArguments) in c:\src\PShochu\PShochu\ProcessHandling.cs:line 20
   at PShochu.Tests.can_run_remote_interactive_tasks.<>c__DisplayClass16.<>c__DisplayClass18.<Specify>b__2() in c:\src\PShochu\PShochu.Tests\can_run_remote_interactive_tasks.cs:line 27
   at NJasmine.Core.Execution.DescribeState.<>c__DisplayClass7`1.<visitBeforeEach>b__3() in c:\src\NJasmine\NJasmine\Core\Execution\DescribeState.cs:line 62
.

Aggiornamento successivo: ho visto in alcuni documenti che sono necessari ulteriori privilegi ( http://msdn.microsoft.com/en-us/library/aa374905%28v=vs.85%29.aspx ). Ho problemi a ottenere test per verificare di avere questi singoli titoli (sono impostati in secpol.msc pre-riavvio)

SE_ASSIGNPRIMARYTOKEN_NAME  "Replace a process level token"
SE_TCB_NAME "Act as part of the operatin system"
SE_INCREASE_QUOTA_NAME  "Adjust memory quotas for a process"
.

Questi test continuano a raccontarmi che non ho le autorizzazioni che ho impostato nell'interfaccia utente, https://github.com/fschwiet/pshochu/blob/master/pshochu.tests/Verify_Privileges.cs

È stato utile?

Soluzione

Attraverso la prova e l'errore ho capito che il token che passa a creareProcesswithtokenw () ha bisogno dei seguenti flag di accesso (almeno su Windows 7 SP1 a 64 bit):

    .
  • token_assign_primary
  • token_duplicate
  • token_query
  • token_adjust_default
  • token_adjust_sessionid

    Gli ultimi due in grassetto sono molto abilmente non menzionati affatto nella documentazione per CreateProcesswithtokenw ().

    Modifica : Il codice seguente funziona bene per me (quando si esegue elevati):

    HANDLE hToken = NULL;
    if(OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE, &hToken))
    {
        HANDLE hDuplicate = NULL;
        if(DuplicateTokenEx(hToken, TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ADJUST_DEFAULT | TOKEN_ADJUST_SESSIONID, NULL, SecurityImpersonation, TokenPrimary, &hDuplicate))
        {
            TCHAR szCommandLine[MAX_PATH];
            _tcscpy_s(szCommandLine, MAX_PATH, _T("C:\\Windows\\system32\\notepad.exe"));
            STARTUPINFO StartupInfo;
            ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
            StartupInfo.cb = sizeof(STARTUPINFO);
            PROCESS_INFORMATION ProcessInformation;
            ZeroMemory(&ProcessInformation, sizeof(PROCESS_INFORMATION));
            if(CreateProcessWithTokenW(hDuplicate, LOGON_WITH_PROFILE, NULL, szCommandLine, 0, NULL, NULL, &StartupInfo, &ProcessInformation))
            {
                WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
                CloseHandle(ProcessInformation.hThread);
                ProcessInformation.hThread = NULL;
                CloseHandle(ProcessInformation.hProcess);
                ProcessInformation.hProcess = NULL;
            }
            CloseHandle(hDuplicate);
            hToken = hDuplicate;
        }
        CloseHandle(hToken);
        hToken = NULL;
    }
    
    .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top