Запустите приложение из службы Windows 7 - PullRequest
3 голосов
/ 27 сентября 2011

В настоящее время мы используем приложение для печати отчетов, запускаемое пользовательской функцией, расположенной в базе данных Firebird, которая работает как служба.

UDF состоит из простой библиотеки DLL, которая запускает приложение для создания отчетов и передает идентификатор отчета для печати через API «CreateProcessAsUser».

Подробно, мы олицетворяем конкретную учетную запись Windows, чтобы иметь доступ к принтеру пользователя. Компьютер, на котором запущено программное обеспечение, никогда не посещается. На самом деле никто не открывает сессию.

Вот как мы это делаем:

LogonUser( sUser, nil, sPass, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken );

...

LoadUserProfile(hToken, ProfileInfo);

...

ImpersonateLoggedOnUser(hToken);

...

StartupInfo.lpDesktop := Pchar('Winsta0\Default');

CreateProcessAsUser(hToken,nil, Pchar(sCommand), nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo);

...

UnloadUserProfile(hToken,ProfileInfo.hProfile);

Теперь мы перешли на платформу Windows 7 и, очевидно, она больше не работает.

Можно ли по-прежнему выдавать себя за учетную запись пользователя и использовать его принтер из службы в Windows Vista / 7, даже если пользователь не вошел в систему? (В противном случае я использовал бы текущий активный идентификатор сеанса пользователя)

Спасибо за вашу помощь

...