WinAPI C - RunAsUser от REDMON_USER и REDMON_SESSIONID - PullRequest
2 голосов
/ 25 мая 2010

Я установил драйвер принтера PostScript и настроил REDMON (redmonnt.dll) для перенаправления вывода postscript в мою программу. В моей довольно простой программе c я собираю данные из STDIN и могу успешно сохранить их в файл .ps. Файл выглядит хорошо.

Однако я хочу запустить gsview.exe для просмотра файла. Если я вызываю ShellExecute, в Windows 7 происходит сбой из-за проблем с разрешениями. Кажется, что моя программа вызывается под другой учетной записью пользователя (LOCAL SERVICE). Поэтому я ищу способ запустить gsview.exe под определенным именем пользователя (пользователя, который инициировал задание печати), которое доступно для программы в переменной REDMON_USER, а также SESSIONID.

Q: Каковы минимальные вызовы WinAPI, необходимые для запуска программы с указанием имени пользователя и идентификатора сеанса?

Любые примеры кода на C / C ++, .NET были бы очень полезны.

РЕДАКТИРОВАТЬ: я пытаюсь сделать что-то очень похожее на redrunee (от redmonee). Я не хочу использовать redrunee, потому что он ненадолго открывается в окне консоли.

Примечание: 1) Программа вызывается службой принтера как учетная запись [LOCAL SERVICE]. 2) Первый параметр Имя пользователя (REDMON_USER), по сути, указывает на пользователя, который в данный момент смотрит на экран

Ответы [ 2 ]

2 голосов
/ 25 мая 2010

Посмотрите на CreateProcessAsUser .

Также посмотрите на CreateProcessWithLogonW и CreateProcess.

Они связаны с CreateProcessAsUser

РЕДАКТИРОВАТЬ В ответ на комментарии OP.

Следуйте советам из этой темы .

Я копирую это здесь дословно, если исходная ссылка перестает работать:

У нас в Vista работает тот же код, что и на XP и т. д. Сервис работает как Локальная система.

  1. используйте WTSGetActiveConsoleSessionId, чтобы получить идентификатор текущего активного Сеанс Windows на консоли (т.е. клавиатура и дисплей машины, как в отличие от сеансов WTS).

  2. используйте WTSQueryUserToken, чтобы получить токен для этого сеанса.

  3. использовать DuplicateTokenEx (hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, & hTokenDup), чтобы скопировать этот токен.

  4. используйте CreateEnvironmentBlock, чтобы создать среду, в которой вы будете переходя к процессу.

  5. использовать CreateProcessAsUser с дублированным токеном и созданным среда. На самом деле, мы используем CreateProcessAsUserW, так как версия имела какую-то ошибку на некоторых старые системы.

  6. Не забудьте CloseHandle на различных токенах и т. Д., И DestroyEnvironmentBlock the окружающая среда.

Спасибо Эфратян .

PS. Ой радости от программирования Windows, не делал это в течение длительного времени. Теперь я помню почему. Единственное, что близко или даже хуже задокументировано, это программирование OpenSSH.

0 голосов
/ 26 мая 2010

Документация описывает функцию «Запуск от имени пользователя», которая, как представляется, именно то, что вам нужно:

Запуск от имени пользователя предназначен для запуска программы GUI, такой как GSview, локально через RedRun.

...