Createprocesswithlogonw не работает на windows 10

Обновлено: 03.07.2024

Функция CreateProcessWithLogonW создает новый процесс и его первичный (главный) поток. Новый процесс затем запускает заданный исполняемый файл в контексте системы безопасности определяемых полномочиями (пользователь, домен и пароль). Она может необязательно загружать профиль пользователя заданный им.

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

[in] Указатель на строку с нулем в конце, которая определяет имя пользователя. Это - имя учетной записи пользователя для входа в систему. Если Вы используете формат UPN , user@DNS_domain_name, параметр lpDomain должен иметь значение ПУСТО (NULL) .

Учетная запись пользователя должна иметь разрешение начать работу в определенном месте на локальном компьютере. Это разрешение предоставляется всем пользователям на рабочих станциях и серверах, но управляется только администраторами на доменах.

[in] Указатель на строку с символом нуля в конце, которая устанавливает имя домена или сервера, учетная запись которого содержит базу данных с учетной записью lpUsername . Если этот параметр имеет значение ПУСТО (NULL), имя пользователя должно быть задано в формате UPN .

Windows XP: Если этот параметр ".", функция считает учетную запись полноценной, используя только локальную базу данных с учетной записью.

[in] Указатель на строку с символом нуля в конце, задающую открытый пароль учетной записи lpUsername .

[in] Параметр входа в систему. Этот параметр может быть одним из следующих значений.

Windows XP: конфигурация разгружается после того, как новый процесс и все дочерние процессы, которые он создал, завершил работу.

Это значение может быть использовано для создания процесса, который использует другой набор полномочий в заданном месте, чем это делается дистанционно. Это полезно в междоменных сценариях, где не имеется меду ними доверительного отношения.

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

[in] Указатель на строку с нулем в конце, которая определяет модуль исполняемого кода. Заданный модуль может быть базирующейся на Windows прикладной программой. Это может быть какой-то другой тип модуля (например, MS-DOS или OS/2 ), если соответствующая подсистема доступна на локальном компьютере.

Параметр lpApplicationName может быть значением ПУСТО (NULL). В этом случае, имя модуля должно быть в строке lpCommandLine как первое незаполненное пространство, разграниченное маркером.

Если Вы используете длинное имя файла, которое содержит пробел, применяйте строки в кавычках, чтобы обозначить, где имя файла заканчивается, и начинаются параметры; иначе, имя файла становится неоднозначным. Например, рассмотрим строку " c:\program files\sub dir\program name ". Эта строка может интерпретироваться несколькими способами. Попытки системы интерпретировать ее, возможны в нижеследующем порядке :

c:\program.exe files\sub dir\program name
c:\program files\sub.exe dir\program name
c:\program files\sub dir\program.exe name
c:\program files\sub dir\program name.exe

Если исполняемый модуль - 16-разрядное приложение, параметр lpApplicationName должен быть значением ПУСТО (NULL), а строка, указанная в параметре lpCommandLine должна задать выполняемый модуль, также как его параметры.

[in] Указатель на строку с символом нуля в конце, определяющую командную строку для выполнения.

Эта функция завершится ошибкой, если этот параметр является строкой типа const .

Параметр lpCommandLine может быть значением ПУСТО (NULL). В этом случае, функция использует строку, указанную параметром lpApplicationName как командную строку.

Если и lpApplicationName и lpCommandLine не пустые (non-NULL), *lpApplicationName задает модуль выполнения, а * lpCommandLine определяет командную строку. Новый процесс может использовать функцию GetCommandLine , чтобы извлечь взятую в целом командную строку. Консольные процессы, написанные на языке C, могут использовать параметры argc и argv , чтобы подробно анализировать командную строку. Поскольку argv [0] - имя модуля, C - программисты обычно повторяют имя модуля как первый маркер в командной строке.

  1. Каталог, из которого загружена прикладная программа.
  2. Текущий каталог родительского процесса.
  3. Windows 95/98/Me: системный каталог Windows. Используйте функцию GetSystemDirectory , чтобы получить путь к этому каталогу.

32-разрядный системный каталог Windows. Используйте функцию GetSystemDirectory , чтобы получить путь к этому каталогу. Имя этого каталога - System32 .

Система добавляет нулевой символ к командной строке, чтобы отделить имя файла от параметров. Он делит исходную строку на две строки для внутренней обработки.

[in] Флажки, которые управляют, когда создается процесс. Флажки CREATE_DEFAULT_ERROR_MODE , CREATE_NEW_CONSOLE , и CREATE_NEW_PROCESS_GROUP включаются по умолчанию. Вы можете определить дополнительные флажки, как отмечено ниже.

Новый процесс не наследует режим ошибки вызывающего процесса. Вместо этого, функция CreateProcessWithLogonW дает новому процессу текущий заданный по умолчанию режим ошибки. Приложение устанавливает текущий заданный по умолчанию режим ошибки путем вызова SetErrorMode .

Этот флажок включается по умолчанию.

Новый процесс получает новую консоль, вместо наследования консоли родителя. Этот флажок не может быть использован с флажком DETACHED_PROCESS .

Этот флажок включается по умолчанию.

Новый процесс становиться корневым процессом группы нового процесса. Группа процесса включает в себя все процессы, которые являются потомками этого корневого процесса. Идентификатор процесса группы нового процесса то же самое, что и идентификатор процесса, который возвращается в параметре lpProcessInfo . Группы процессов используются функцией GenerateConsoleCtrlEvent , чтобы дать возможность отправлять сигнал CTRL+C или CTRL+BREAK группе консольных процессов.

Этот флажок включается по умолчанию.

Этот флажок является правильным только тогда, когда стартует 16-разрядное базирующееся на Windows приложение. Если он установлен, новый процесс выполняется в отдельной Виртуальной Машине DOS ( VDM ). По умолчанию, все 16-разрядные приложения, базирующиеся на Windows, работают на отдельной, совместно используемой VDM . Преимущество отдельного запуска в том, что аварийный отказ завершает работу только отдельной VDM ; любые другие программы, выполняющиеся в различных VDM продолжают функционировать как обычно. К тому же, 16-разрядные приложения базирующиеся на Windows, которые работают в отдельных VDM , имеют отдельные очереди введенных данных. Это означает то, что если одно приложение останавливает ответ в данный момент, приложения в отдельных VDM продолжают получать ввод данных.

Первичный поток нового процесса создается в состоянии ожидания, и не запускается до тех пор, пока не будет вызвана функция ResumeThread .

Обозначает формат параметра lpEnvironment . Если этот флажок установлен, блок конфигурации, указанный lpEnvironment использует символы Unicode. Иначе, блок конфигурации использует символы ANSI .

Этот параметр также управляет и классом приоритета нового процесса, который используется в определении приоритетов диспетчеризации потоков процесса. За перечнем значений обратитесь к статье о функции GetPriorityClass . Если ни один из флажков класса приоритета не установлен, значения по умолчанию класса приоритета NORMAL_PRIORITY_CLASS , если класс приоритета процесса созданного процесса не является IDLE_PRIORITY_CLASS или BELOW_NORMAL_PRIORITY_CLASS . В данном случае дочерние процессы получают заданный по умолчанию класс приоритета вызывающего процесса.

lpEnvironment

[in] Указатель на блок конфигурации нового процесса. Если этот параметр имеет значение ПУСТО (NULL), новый процесс использует конфигурацию вызывающего процесса.

Блок конфигурации состоит из блока строк с символом нуля в конце, который завершается также нулем. Каждая строка представляется в форме:

Поскольку знак "=" используется как разделитель, он не должен быть использован в имени переменной окружения.

Блок конфигурации может содержать или символы Unicode или ANSI . Если блок конфигурации, указанный параметром lpEnvironment , содержит символы Unicode , убедитесь, что в параметре dwCreationFlags установлен флажок CREATE_UNICODE_ENVIRONMENT . Если блок содержит символы ANSI , этот флажок будет сброшен.

Обратите внимание! на то, что блок конфигурации в ANSI заканчивается двумя нулевыми байтами: один для последней строки, еще один, чтобы завершить блок. Блок конфигурации Уникода заканчивается четырьмя нулевыми байтами: два - для последней строки, еще два, чтобы завершить блок.

Чтобы получить копию блока конфигурации для данного пользователя, используйте функцию CreateEnvironmentBlock .

[in] Указатель на строку с символом нуля в конце, определяющую текущий диск и каталог для нового процесса. Строка должна быть полным путем, который включает в себя букву (имя) диска. Если этот параметр является значением ПУСТО (NULL), новый процесс будет иметь тот же самый текущий диск и каталог, что и вызывающий процесс. (Этот параметр дается, прежде всего, для оболочек, которым нужно запустить прикладную программу и установить ее исходный диск и рабочий каталог).

[in] Указатель на структуру STARTUPINFO , которая устанавливает оконный режим терминала, рабочий стол, стандартные дескрипторы и внешний вид главного окна для нового процесса.

Если ее член lpDesktop имеет значение ПУСТО (NULL) или он - пустая строка, новый процесс наследует рабочий стол и оконный режим терминала своего родительского процесса. Функция CreateProcessWithLogonW добавляет разрешение для заданной учетной записи пользователя наследовать оконный режим терминала и рабочего стола. Иначе, если этот член устанавливает рабочий стол, то возникает ответственность приложения, чтобы добавить разрешение для заданной учетной записи пользователя для заданного оконного терминала и рабочего стола.

[out] Указатель на структуру PROCESS_INFORMATION , которая принимает идентифицирующую информацию о новом процессе, включая дескриптор процесса.

Дескрипторы в структуре PROCESS_INFORMATION , когда они больше не нужны, должны быть закрыты функцией CloseHandle .

Возвращаемые значения

Если функция завершается успешно, величина возвращаемого значения - не ноль.

Если функция завершается с ошибкой, величина возвращаемого значения - ноль. Чтобы получить дополнительные данные об ошибках, вызовите GetLastError .

Замечания

По умолчанию, функция CreateProcessWithLogonW не загружает заданный профиль пользователя в ключ системного реестра HKEY_USERS . Это означает, что доступ к информации в ключе системного реестра HKEY_CURRENT_USER , не может достичь результатов совместимых с нормальным интерактивным входом в систему. Это является вашей ответственностью загрузить улей системного реестра пользователя в HKEY_USERS перед вызовом CreateProcessWithLogonW , используя, или LOGON_WITH_PROFILE , или вызывая функцию LoadUserProfile .

Если параметр lpEnvironment имеет значение ПУСТО (NULL), новый процесс наследует конфигурацию вызывающего процесса. Функция CreateProcessWithLogonW автоматически не изменяет блок конфигурации, чтобы включить переменные окружения, конкретные для пользователя. Например, переменные USERNAME и USERDOMAIN наследуются от вызывающего процесса, если lpEnvironment - значение ПУСТО (NULL). Это - вы отвечаете за подготовку блока конфигурации нового процесса и устанавливаете его в lpEnvironment .

Когда идет действие создания, дескрипторы нового процесса и потока получают полные права доступа ( PROCESS_ALL_ACCESS и THREAD_ALL_ACCESS ). Любой из дескрипторов, если дескриптор безопасности не предусмотрен, может быть использован в любой функции, которая требует дескриптора объекта этого типа. Когда предоставлен дескриптор безопасности, проверка прав доступа выполняется для всех последующих используемых дескрипторов прежде, чем доступ предоставляется. Если доступ не дан, запрашивающий процесс не может использовать дескриптор, чтобы получить доступ к процессу или потоку.

Чтобы извлечь маркер системы безопасности, передайте дескриптор процесса в структуру PROCESS_INFORMATION для функции OpenProcessToken .

Процессу присваивается идентификатор. Идентификатор является правильным до тех пор, пока процесс не завершит работу. Он может быть использован, чтобы идентифицировать процесс, или открыть определяемый функцией OpenProcess дескриптор процесса. Начальный поток в процессе также получает свой идентификатор. Он может быть задан функцией OpenThread , чтобы открыть дескриптор потока. Идентификатор правильный до тех пор, пока поток закончит свою работу и может быть использован, чтобы уникально идентифицировать поток в пределах системы. Эти идентификаторы возвращаются в структуре PROCESS_INFORMATION .

Вызывающий поток может использовать функцию WaitForInputIdle , чтобы ждать до тех пор, пока новый процесс не завершит свою инициализацию и станет ждать от пользователя ввода данных без задержки ввода. Этот прием может быть полезным для синхронизации родительского и дочернего процессов, поскольку функция CreateProcessWithLogonW возвращает значение не ожидая, когда новый процесс закончит свою инициализацию. Например, создающий процесс должен использовать функцию WaitForInputIdle перед попыткой найти окно, связанное с новым процессом.

Предпочтительным способом выключить процесс является использование функции ExitProcess , потому что эта функция отправляет уведомление всем динамически подключаемым библиотекам ( DLL ), связанным с процессом о приближающемся завершении работы. Другой способ завершения процесса не уведомляет связанные DLL .

Обратите внимание! на то, что когда поток вызывает ExitProcess , другие потоки процесса, завершают работу без возможности выполнить какой-либо дополнительный код (включая код завершения потока связанных DLL ). За дополнительной информацией обратитесь к статье Завершение работы процесса.

Чтобы компилировать приложение, которое использует эту функцию, определите макрокоманду _WIN32_WINNT как 0x0500 или позже. Для получения дополнительной информации, см. статью Использование заголовков SDK .

Замечания по безопасности

Параметр lpApplicationName , может иметь значение ПУСТО (NULL), в этом случае имя исполняемой программы должно быть первое незаполненное пространство разграничивающее строку в параметре lpCommandLine . Если имя пути или исполняемой программы имеют пробел, имеется риск того, что может быть запущена другая исполняемая программа из-за способа, которым функция подробно анализирует пробелы. Нижеследующий пример демонстрирует эту опасность, потому что функция вместо "MyApp.exe" будет пытаться запустить "Program.exe", если таковая существует .

Если неграмотный пользователь создаст в системе прикладную программу, называемую "Program.exe", любая программа, которая неправильно вызывает функцию CreateProcessWithLogonW , используя каталог Program Files, будет запускать это приложение вместо заданной программы .

Чтобы избежать этой проблемы, не передавайте значение ПУСТО (NULL) для параметра lpApplicationName . Если Вы передаете это значение ПУСТО (NULL) для lpApplicationName , используйте кавычки вокруг пути к исполняемой программе в параметре lpCommandLine , как показано в примере ниже.

Репутация: нет
Всего: нет

Долго пытаюсь уже решить данную проблему, но безуспешно.
Может кто из читающих, что-нибудь подскажет по теме.

Проблема в том, что есть сервис запущенный с минимальным привилегиями и нужно, чтобы этот сервис запускал консольное приложение от имени администратора.
Проблема состоит в том, что в ОС Windows 7 не консольные приложения нормально запускаются, а вот консольные не запускаются.
Под XP и консольные запускаются нормально.

Один из вариантов запуска:

Может, кто сможет подсказать.
Буду очень признателен.

Репутация: нет
Всего: нет

Я тоже мучаюсь с этой проблемой.

А подскажи как ты определяешь.

Рабочую станцию и рабочий стол?

Репутация: нет
Всего: нет

Репутация: нет
Всего: нет

Блин у меня на windows7 x64 +delphi 2011 не работает(

Если как обычное приложение все отлично если как сервис ни одно окно не показывается.
Хотя процесс запускается отлично.(

Репутация: нет
Всего: нет


Результат процедуры Log покажи. Или вопрос, у тебя CreateProcessWithLogon выполняется или нет?

Репутация: нет
Всего: нет

Код

unit Unit1;

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls;

Если строчку с указанием рабочего стола закоментировать то процесс запускается
но на десктопе текущего пользователя не появляется.
Если раскоментировать то вообще не запускается

CreateProcessWithLogonW всегда возврашает true типа все удачно
gestlasterror возврашает 0.

Служба под пользователем programist (он в группе администраторы)

Репутация: нет
Всего: нет

Если из под Ситемы запускаю то выводит в лог ошибку 5
Отказано в доступе.

Репутация: нет
Всего: нет

Судя по коду. Когда у тебя отображается результат gestlasterror, то CreateProcessWithLogonW не выполняется.

Репутация: 21
Всего: 88

grofast, кнопка КОД справа вверху над формой ответа

Репутация: 15
Всего: 72

Нарыл у себя в закромах.
Писалось несколько лет назад, проверено сейчас под Vista - cmd.exe из сервиса запускается на активном десктопе "только так". В висте система разграничения учетных записей, afair, не отличается от семерки - так же в разных терминальных сессиях, соответственно - разные WinSta и Desktop. Смотреть метод Timer1Timer.
Функции когда-то писались под запуск вообще любого файла, у которого есть ассоциации в реестре.

Может быть, что-то (или большинство) лишнее - просьба удалить самим


Присоединённый файл ( Кол-во скачиваний: 485 )
Unit1.pas 7,57 Kb

Репутация: нет
Всего: нет

Судя по коду. Когда у тебя отображается результат gestlasterror, то CreateProcessWithLogonW не выполняется.

у меня в коде прописано и если удачно процесс создается и если не удачно

Код

//****************Если не удачно

Я кстати досмотрелся вчера ,в логах пишет что приложение запустилось но не может инициализироваться.
Видимо из-за виртуализации.

Если под тем пользователем под которым стартует служба то приложение запускается
но на десктопе текущего пользователя не отображается я так думаю оно в нулевой сессии.
Висит себе в процесах.

Если из под другого пользователя приложение пытается запуститься
то в логах пишет

explorer.exe - Ошибка приложения
Ошибка при запуске приложения (0xc0000142). Для выхода из приложения нажмите кнопку "ОК".

То есть CreateProcessWithLogonW отрабатывает на отлично

приложение запускается но почемуто не может инициализироватся.

Я так думаю из-за виртуализации.

Добавлено @ 10:18

Репутация: нет
Всего: нет

Нарыл у себя в закромах.
Писалось несколько лет назад, проверено сейчас под Vista - cmd.exe из сервиса запускается на активном десктопе "только так". В висте система разграничения учетных записей, afair, не отличается от семерки - так же в разных терминальных сессиях, соответственно - разные WinSta и Desktop. Смотреть метод Timer1Timer.
Функции когда-то писались под запуск вообще любого файла, у которого есть ассоциации в реестре.

Я много функций переписал одной строкой и много нового узнал.

И все заработало.

Спасибо спасибо спасибо)))).

Репутация: нет
Всего: нет

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

Если ни один пользователь не залогинен можно ли из под службы (system) запустить мою программу с правами пользователя?

Или может залогинится сначала под ним нужно.?

Репутация: 21
Всего: 88

Модератор: grofast, я второй раз прошу тебя пользоваться кнопкой "код". В следующий раз пойдешь на пару дней в ридонли

Репутация: 15
Всего: 72


Чтобы запустить программу с правами пользователя, нужно получить права пользователя. Чтобы получить права пользователя, нужно или получить его токен (для не-вошедшего в систему пользователя - вызвать LogonUser) или сразу вызвать CreateProcessWithLogonW, которая автоматом его "залогинет".
P.S. Могу ошибаться - давно не освежал в памяти данные этого направления.
P.P.S.

Вспомнил, что у этих моих функций есть ограничение, вытекающее из ограничения WTSGetActiveConsoleSessionID - если активно используется FastUserSwitching, то она будет возвращать SessionID для первого из залогиненных, и не важно, находится его сессия в WTS_SESSIONSTATE_LOCK (вызывана "смена пользователя") или активна.
Решение, afair, в регистрации для своего сервиса нотификаций о смене сессии (SERVICE_CONTROL_SESSIONCHANGE), правда для этого нужно задействовать HandlerEx, а не Handler, как в Delphi ( по крайней мере по D7 включительно) и работе уже с этими данными.

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

[ Время генерации скрипта: 0.1547 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Пожалуйста, выделяйте текст программы тегом [сode=pas] . [/сode] . Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

'> CreateProcessWithLogonW , запуск процеса от другого имени пользователя

Что нужно указывать функ. CreateProcessWithLogonW в качестве пароля если пароль пустой(тоесть нет пароля на учетной записи).
Есть ли какието функ. через которые можна проверить правильность логина и пароля??

Добавлено 05.09.09, 12:33
а также как узнать свой домен для функ. LogonUser ?



Что нужно указывать функ. CreateProcessWithLogonW в качестве пароля если пароль пустой(тоесть нет пароля на учетной записи)

Насколько я помню, CreateProcessWithLogonW не работает с учетной записью,
если у нее нет пароля. А что говорит MSDN по этому поводу ?

В мсдн вроде ничего по этому поводу не сказано, но на васме нашол что вроде с пустый паролем не получиться.

Добавлено 05.09.09, 13:22
Вопрос а как можна взять под отладку WinLogon.exe ?
просто запустить отладчик низя пока не войду в сист.(
Я хочу вот что сделать: запустить WinLogon под отладчиком и попробывать глянуть как этот процес с пустым паролем заходит.
из отлдачиков есть :SoftIce, OllyDbg



В мсдн вроде ничего по этому поводу не сказано, но на васме нашол что вроде с пустый паролем не получиться.

Честно говоря, я уж и не помню у кого я это вычитала.
Да и было это давно. С тех пор многое могло изменится.

Я хочу вот что сделать: запустить WinLogon под отладчиком и попробывать глянуть как этот процес с пустым паролем заходит

Тут дело такое. Меня терзают смутные сомнения, что CreateProcessWithLogonW
не неумеет работать с "пустым паролем", а это сделано спецально из соображений безопасности.

А насчет "WinLogon под отладчиком", так мне кажется, что перехвать в ней парочку ф-ий
и проще и удобнее

Привет, я совершенно новичок в программировании. И, пожалуйста, кто-нибудь, помогите мне.

Я пытаюсь запустить процесс из службы.
Мне нужно начать новый процесс, предложив пользователю ввести учетные данные администратора.

Я пытался использовать CreateProcessWithLogonW() ,

Я использую правильную функцию.
Я попытался ввести имя пользователя, пароль, домен как localhost. Я дал полный путь к файлу .exe, который мне нужно запустить.

Но процесс так и не начался. Ребята, скажите, что я делаю не так?
И что мне нужно сделать, чтобы предложить пользователю ввести учетные данные администратора вместо жесткого кодирования.

Решение

Ни одна из функций CreateProcess * не предложит никаких подсказок. Они низкоуровневые API и ничего не знают о GUI.

Если вы хотите, чтобы пользователю было предложено, используйте ShellExecuteEx с runas команда. Windows сначала запросит разрешение на повышение, а затем запросит учетные данные.

Другие решения

Вы также можете корректно экранировать строку программы:

должно быть как минимум:

Честно говоря, в этом коде есть множество неправильных вещей, от неправильной настройки SI до параметров, передаваемых самому API. Я предлагаю вам прочитать больше.

Одной из проблем является передача строкового литерала в качестве аргумента командной строки, так как этот аргумент должен быть изменяемым. От CreateProcessWithLogon() по отношению к аргументу командной строки:

Функция может изменять содержимое этой строки. Следовательно, этот параметр не может быть указателем на постоянную память (такую ​​как переменная const или литеральная строка). Если этот параметр является константной строкой, функция может вызвать нарушение прав доступа.

Вы также должны избежать обратной косой черты. Изменить на:

и передать cmdLine вместо.

После проверки любого сбоя функции WINAPI GetLastError() как он проинформирует вас о причине отказа.

Нарушение прав доступа связано с параметром lpCommandLine. Это предназначено для редактируемой памяти, LPWSTR и функция API действительно изменяют буфер. Но вы передаете указатель на неизменяемую память.

Но есть более фундаментальная проблема. Вы говорите, что хотите запросить учетные данные от службы. Службы не должны отображать пользовательский интерфейс, а в современных версиях Windows служба просто не может отображать пользовательский интерфейс. Ваш дизайн имеет недостатки, и вы должны пересмотреть его.

Может быть, слишком поздно, чтобы помочь вам. Но это может быть полезно для других, хотя. Если вы используете CreateProcessWithLogonW функция, и вы используете Default рабочий стол просто держать lpDesktop как NULL.

Если lpDesktop это не Null, вы должны ввести sid пользователя (получение с LookupAccountNamean ) как ACE в настольных компьютерах и на winstation DACL

Итак, вот шаги, которые вы должны сделать, чтобы добавить ACE для рабочего стола:

  1. получить дескриптор рабочего стола с OpenDesktop , используйте право dwDesiredAccess
  2. получить Security Descriptor с GetSecurityInfo а также DACL_SECURITY_INFORMATION как securityinfo
  3. получить DACL от твоего Security Descriptor
  4. добавлять AddAccessAllowedAce с sid sid вашего пользователя
  5. Установить измененный DACL на дескриптор вашего рабочего стола

Теперь повторите эти шаги для winsta0 winstation

Командир г-на Яростного в documantary очень помог мне решить эту проблему.

Читайте также: