Как запустить универсальное приложение в качестве другого пользователя с WinAPI? - PullRequest
0 голосов
/ 07 ноября 2018

Как я могу запустить универсальное приложение от имени CreateProcessWithLogonW() от имени другого пользователя? Я не могу запустить его, используя C:\\Windows\\System32\\cmd.exe /c start skype:, даже если start skype: запускается в терминале.

#include <stdio.h>
#include <windows.h>
#include <lmcons.h>

int main(void)
{
    PROCESS_INFORMATION pi = { 0 };
    STARTUPINFOW        si = { 0 };
    si.cb = sizeof(STARTUPINFOW);

    /*
    not working:
    L"C:\\Windows\\System32\\cmd.exe /c start skype"        error: "The filename, directory name, or volume label syntax is incorrect."
    L"C:\\Windows\\System32\\cmd.exe /c start skype:"       no error but a pop-up with text: "You'll need a new app to open this"
    */
    wchar_t lpCommandLine[] = L"C:\\Windows\\System32\\cmd.exe /c start skype:"; // lpCommandLine must be writable memory
    if (!CreateProcessWithLogonW(L"username", L".", L"password", LOGON_WITH_PROFILE, NULL, lpCommandLine, 0, NULL, NULL, &si, &pi))
    {
        printf("GetLastError(): %i\n", GetLastError());
        char buf[UNLEN + 1] = { 0 };
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, sizeof(buf), NULL);
        puts(buf);

        return 1;
    }
    else
    {
        // do stuff only while skype is running
        puts("skype is running.");

        if (WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_FAILED)
            puts("WaitForSingleObject() failed");

        // do stuff only after skype exits
        puts("skype is NOT running.");
    }

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Это возможно в зависимости от того, что вы подразумеваете под другим пользователем. Например, в нашем продукте есть служба Windows, которая работает под учетной записью «Локальная система», и благодаря этому мы можем запустить приложение UWP в текущей учетной записи пользователя. Для этого мы использовали CreateProcessAsUser , чтобы запустить процесс в учетной записи зарегистрированного пользователя с командой, чтобы открыть протокол, поддерживаемый приложением UWP. Пример кода:

        string uwpAppLaunchCmdLine = string.Format("/c start {0}", PROTOCOL_SUPPORTED_BY_UWP_APP);
        int processId;
        IntPtr hErrorReadOut = IntPtr.Zero;
        ProcessMetadata processMetadata;
        if (!StartAsCurrentUser("cmd.exe", false, out processId,out processMetadata, coreAppLaunchCmdLine))
        {
            //Failed to launch
        }
        else
        {
           //success!
        }   
0 голосов
/ 08 ноября 2018

Это невозможно. Независимо от того, под каким пользователем запускается приложение UWP, оно всегда будет работать под изолированным пользователем AppContainer, которое отличается для каждого сеанса пользователя. Вы не можете запустить приложение UWP как другой пользователь, использующий API Win32.

...