Запуск программы с графическим интерфейсом без необходимости входа в Windows - PullRequest
0 голосов
/ 25 июня 2019

Я новичок здесь, пожалуйста, дайте мне знать, если я сделал ошибку в своем сообщении.

Я пытаюсь запустить exe-файл с графическим интерфейсом без необходимости входа в Windows 7. Я пытался: Планировщик заданий Windows, NSSM, Команда SC, Пакетный файл в папке автозагрузки, исполняемый файл в папке автозагрузки,

Кроме того, команда SC была опробована с множеством различных аргументов и опций. Я пробовал NSSM, Windows Task Scheduler и команду SC с возможностью использования определенной учетной записи (не уверен в деталях), предоставляя локальное имя пользователя и пароль. Все они были опробованы как для пакетных файлов, так и для исполняемых файлов. Единственной целью командного файла было запустить исполняемый файл. Я подумал, что, возможно, этот косвенный подход поможет до некоторой степени, но нет никакой разницы в попытке запустить программу до входа в систему.

Ключом является GUI, потому что, например, я смог запустить командный файл, который создал пустой текстовый файл, прежде чем войти в систему (проверено временем), используя планировщик задач Windows, NSSM и команду SC.

Однако, если я попытаюсь запустить, скажем, notepad.exe (запустите notepad.exe), он не будет работать. Блокнот не будет отображаться как задача, не будет иметь окна и не будет отображаться как процесс. Я попытался поместить команду создания txt-файла после команды запуска в пакетном файле, и файл создается (поэтому пакетный файл не зависает при запуске), но в блокноте нет никаких следов. Некоторые из моих коллег также предположили, что это результат графического интерфейса и того, как он должен проводить сеанс на рабочем столе.

Что РАБОТАЕТ: 1. Разрешение входа в систему при загрузке без пароля. 2. Выполнение командного файла, который запустит программу, а затем заблокировать компьютер. 3. Рабочий стол будет мигать только около 1 секунды.

Проблема: этого недостаточно, поскольку это уязвимость, даже если она длится всего доли секунды.

Нашел кого-то, у кого была проблема, похожая на меня, и включил ее в качестве решения, но он признает, что это не безопасный подход. https://serverfault.com/questions/583517/start-program-on-computer-startup-when-nobody-is-logged-on-and-show-the-window-w

Есть еще один путь, который я не совсем понимаю, и который, я думаю, может сработать. Это касается функций LogonUser (), ImpersonateLoggedOnUser (), CreateProcessAsUser (), CreateProcessWithLogonW () . Я хотел бы запустить его в качестве службы, которая сможет "войти в систему" и запустить программу.

Код для создания сеанса:

bool startProcess(string path) {

    _STARTUPINFOA info; 

    info.cb = sizeof(info);
    info.lpReserved = NULL; 

    //The name of the desktop to which we want to connect. 
    info.lpDesktop = NULL; 

    //The title assigned to the GUI window. 
    info.lpTitle = NULL;

    //Offset of the window from top left corner
    info.dwX = 0;
    info.dwY = 0;

    //Size of the GUI window that is created. 
    info.dwXSize = 1000;
    info.dwYSize = 900;

    //Specifies the nunmber of columns of a console (if applicable) of characters. 
    info.dwXCountChars = 30;

    //Specifris the number of rows of characters of a console window
    info.dwYCountChars = 0;

    //Specifies the color when opening the new GUI
    info.dwFillAttribute = 0;

    //Specifies different visual attributes, such as for the cursor. 
    info.dwFlags = 0; 

    //This must be zero. 
    info.cbReserved2 = 0; 
    //This must be NULL. 
    info.lpReserved2 = NULL; 


    info.dwFlags = 0; 

    //This is NULL because of the value of dwFlags. 
    info.hStdInput = NULL;

    //This is ignored because of dwFlahs. 
    info.wShowWindow = 0; 

    //This is NULL because of the dwFlags. 
    info.hStdOutput = NULL; 

    //This is NULL because of the value of dwFlags. 
    info.hStdError = NULL; 



    PROCESS_INFORMATION ThreadInfo; 
    bool success = CreateProcessAsUserA(theHandle, path.c_str(), NULL, NULL, NULL, false, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &info, &ThreadInfo);
    //lpStartupInfo might be useful in the situation that a display window is not being shown. 
    threadHandle = ThreadInfo.hThread;
    if (!success) {
        return false;
    }
    else {
        return true;
    }
}

Что-то, что я не считаю столь значительным, и в большинстве случаев не встречается, но появляется, когда я хакуюсь вокруг:

обнаружена ошибка: ошибка 1053: служба не ответила на своевременный запуск запроса на управление

Попробовал: очистка реестра Загрузка фреймворка NET 4.5.

...