В настоящее время мы используем приложение для печати отчетов, запускаемое пользовательской функцией, расположенной в базе данных 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, даже если пользователь не вошел в систему? (В противном случае я использовал бы текущий активный идентификатор сеанса пользователя)
Спасибо за вашу помощь