Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Печать на принтер из под SYSTEM. Как сделать чтоб приложение видело/печатало?
|
|||
|---|---|---|---|
|
#18+
Не знаю даже в какую тему писать, но вроде здесь люди самые эрудированные, в VB6 это точно без ответа останется. Попробую по порядку. Например я хочу распечатать некий документ (неважно что jpg,txt,) Немного теории. Используется метод printto - неточно, зависит от реестра но наиболее универсально. Примеры печати из приложения: 1. Запуск ShellExecute ("printto") Код: vbnet 1. 2. 3. 4. 2. Зная стандартное приложение и подглядев ключи "printto" в реестре, можно обезопасить себя от случайного отсутствия ключа в реестре Т.е. например для jpg,tif, bmp, png и т.п. графики стандартный метод такой: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 2A. А если совсем культурно, нашаманив согласно статье СВЕДЕНИЯ: интерфейс программ Windows Rundll и Rundll32 , то прямым вызовом API: Код: vbnet 1. 2. 3. 4. 3. Именно "printto" используется например при добавлении задания в MS Fax FaxDocument.ConnectedSubmit method Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Здесь файл произвольного формата (jpg) передается методу ConnectedSubmit, который осуществляет печать jpg через "printto", как я расписал выше на принтер "Fax". ========================================== Теперь о проблеме. 1. Обнаружил на Win 8.1 x64 при запуске процедуры objFaxDocument.ConnectedSubmit под Local SYSTEM (режим AsService). Дебаг показал что objFaxDocument.ConnectedSubmit намертво завис без всяких ошибок и код "застрял" (печать файла типа jpg). 2. В то же время я обнаружил, что "печать txt" (printto+notepad) проходит тем же кодом абсолютно нормально. Т.е. txt печатается и факс-задание добавляется (под System!!!) 3. Я начал рыться в ключах реестра, пытаться менять дефолтные приложения для jpg (shimgvw -стандартный просмотрщик, mspaint), сделал тестовое приложение. Ничего не помогает. Под юзером все OK, под SYSTEM -Ж. Причем Ж и при прямом вызове shimgvw.dll,ImageView_PrintTo /pt "%1" "%2" А это тонкий намек на то что Extension-Associations не зависят от аккаунта. !!! при этом печать txt через блокнот всегда работает. 4. Я даже скачал утилитку Русиновича и научился запускать тест-прогу под System: psexec -s -i -d cmd.exe Далее из cmd запускаем любой exe и смотрим чего происходит. 5. Далее я начитался топиков на форумах и там был дан совет кому-то в такой ситуации. Запустить psexec -s -i -d notepad.exe (под System) , потом Печать, и посмотреть все ли принтеры на месте. Я проверил, на месте. И печатают. Но с notepad и в автомате проблем нет. 6. И все-таки мне удалось высечь. Я запустил psexec -s -i -d myproga.exe (под System) В myproga.exe у меня GUI и есть команды печати. Так вот, она вообще не видит ни одного принтера. Более того, из myproga.exe я вывел картинку через стандартный просмотрщик rundll32 shimgvw.dll,ImageView_Fullscreen test.pict И фотовьюер при попытке нажать в нем Print заявил буквально следующее: Windows Photo Viewer can't print this picture because there is no printer installed or a service Windows needs is not running. Исходя из всего сказанного, выводы такие: 1. Часть приложений при запуске из-под System видят принтеры и способны печатать (например блокнот). 2. Другие приложения по какой-то причине не видят принтеры и отсюда проблемы. Как лечить свое приложение чтоб оно видело принтеры? Я конечно попытался добавить права для SYSTEM для принтера, но думаю это не то и не помогло. '--- Я когда-то уже решал подобную похожую проблему. Хитро запущенное приложение не видело базу данных под x64. Непонятки при доступе к объектам БД при запуске приложения VB6 "из под принтера". ПРИЧИНАWhen exporting, RMS needs and looks for oledb32.dll, by default this is located in: C:\Program Files (x86)\Common Files\System\Ole DB\. However the location could be different from the default and when RMS searches for the dll it uses the system variable %CommonProgramFiles(x86)% to find this location. There is a known issue in Windows Vista X64 and Windows 2008 X64 that when the CreateEnvironmentBlock function is called without inheriting environment variables from the current process, the returned environment block is missing the following environment variables: CommonProgramFiles(x86), CommonProgramW6432, ProgramFiles(x86), ProgramW6432. This causes RMS to fail to find oledb32.dll and the export fails. Решение Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. И у меня ощущение, что под System проги также теряют какую-то Environment Variable и не видят принтеров. И ее надо "восстанавливать" ручками. Notepad -то видит!!! Есть идеи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 10:53 |
|
||
|
Печать на принтер из под SYSTEM. Как сделать чтоб приложение видело/печатало?
|
|||
|---|---|---|---|
|
#18+
Ну, в принципе нашел решение: registration required. Printing from windows service on windows 8 fails решениеAt http://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/fdcfa0fa-50aa-4a61-be79-5b4c8f65fbf7/ we see that this was reported to Microsoft and confirmed as a bug in Windows 8 and Windows Server 2012. This bug is triggered when trying to print from a 32bit process in non-standard user session (like e.g. a service). According to Microsoft, this a bug was resolved in Windows 8.1 and Windows Server 2012 R2. However, we could still reproduce it on Windows 8.1. On the same site, a workaround is given by Microsoft. This workaround solved the problem for us on Windows 8.1. It probably also works on Windows 8 and Windows Server 2012. The workaround goes as follows: 1.Open Regedit and go to HKEY_CLASSES_ROOT\CLSID{BA7C0D29-81CA-4901-B450-634E20BB8C34} 2.Check the value of the "AppID" Registry Entry. In our case this was {AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0} 3.Now go to HKEY_CLASSES_ROOT\AppID{AA0B85DA-FDDF-4272-8D1D-FF9B966D75B0} (or the respective value you found on your system) 4.Under this registry key, delete the entries with the name "AccessPermission", "LaunchPermission" and "RunAs" Since this is a bug in Windows, you cannot fix it in your code. The workaround might have side effects, but we haven't seen any so far in our scenario. Оно решает задачу видимости принтеров под System и частчно с objFaxDocument.ConnectedSubmit - частично, потому что "printto" под System почему-то не работает (видимо это независимый баг). A shimgvw.dll,ImageView_PrintTo /pt "%1" "%2" хоть и стало работать, но его в лоб в метод не засунешь, подсовывается TIFF сконвертированный из JPG напрямую например (я всегда делаю tiff если printto дает ошибку), ConnectedSubmit его как-то выправляет, по крайне мере этот TIFF перестал стопорить метод. Но, блин, грохать ключи в реестре... последнее дело. Тем более программно это еще надо думать как. Там ведь с TrustedInstaller надо владельца снимать и назначать Administrators, потом права себе давать, потом удалять параметры. Потом по хорошему TrustedInstaller назад восстанавливать. И еще абсолютно неясно что там удаляется и за что оно отвечает. Хорошо б на уровне программы как-то фиксить, Notepad же фиксит для себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 10:53 |
|
||
|
Печать на принтер из под SYSTEM. Как сделать чтоб приложение видело/печатало?
|
|||
|---|---|---|---|
|
#18+
Модератор:Тема перенесена из форума "C++". Не надо так делать, я нашел даже не сразу. Убери ее оттуда. Можешь конечно мувнуть в VB6, если здесь мешает но там мне вряд ли помогут, подскажут. В "Windows" точно никто ничего не скажет, там больше дилетанты, чем профи. А я рассчитывал на помощь профессионалов, и рассчитывал найти их именно здесь. Это не "общие вопросы", это тонкий вопрос (печать из под System). Потому что даже сделать программно то что постом выше, надо получить права на ветку реестра. И оригинальные примеры на C++, а даже не на VB. И я вот сейчас изучаю коды типа вот этого: Finding the Owner of a File Object in C++ И могут возникнуть вопросы. Мне их в "Windows" любителям чего-то похакать задавать? Уважаемый модератор, лучше просто сотрите сотрите низ и верх этого сообщения и оставьте тему здесь. Спасибо за понимание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 10:54 |
|
||
|
Печать на принтер из под SYSTEM. Как сделать чтоб приложение видело/печатало?
|
|||
|---|---|---|---|
|
#18+
И давайте ценить время друг друга. Я сейчас сидел часов 12, разбирался с вопросом. Потратил время на описание проблемы. До чего-то докопался (по теме), решение не поленился опубликовать, а оно не тривиальное. А вы взяли и мувнули, не надо так делать. Мне честно обидно. Спасибо еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 10:58 |
|
||
|
Печать на принтер из под SYSTEM. Как сделать чтоб приложение видело/печатало?
|
|||
|---|---|---|---|
|
#18+
В "Windows" точно никто ничего не скажет, там больше дилетанты, чем профи. А я рассчитывал на помощь профессионалов, и рассчитывал найти их именно здесь. Профессионалы отличаются профессионализмом. А это значит, в частности, соблюдение правил. Это не "общие вопросы", это тонкий вопрос (печать из под System). И этот вопрос никак к относится к С или С++. Я не знаю, как тема попала обратно, но раз уж так хочешь, — пусть остается. Заметь, что в итоге тебе никто не помог ни там, ни тут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 12:24 |
|
||
|
Печать на принтер из под SYSTEM. Как сделать чтоб приложение видело/печатало?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, >И этот вопрос никак к относится к С или С++. Если так рассуждать, то здесь можно обсуждать по 5 дней только конвертацию многочисленных типов строк в указатели и обратно и создание хитровыдуманных классов и т.п. Я все таки считаю что классическое WIN32 API это де факто привелегия C/++ (хоть бы я эти API в VB перевожу - ну на это да рука набита за годы) В объектном програмировании люди обычно неглубоко врубаются в тонкости и возможности поверхностные. Вероятность того что люди пишущие C++ лучше разбираются в "принтерах", системных аккаунтах, правах доступа и т.п. как бы больше. >Я не знаю, как тема попала обратно, но раз уж так хочешь, — пусть остается. Потому что я не поленился ее восстановить оттуда. Да, хочу. Я часто возвращаюсь в своих темах к решению старых нерешенных проблем. Там она канет очень быстро и не найду, потому что ветка Windows мусорная. >Заметь, что в итоге тебе никто не помог ни там, ни тут. А вопрос нелегкий. И воспроизводить тяжело. Я довольно долго лазил по инету, про реестр это удача просто что нашел. Я обычно сам нахожу решение в таких случаях. Зачем тогда пишу? Во первых формулирую проблему, во-вторых ставка пусть на 1 % что кто-то знает, сталкивался, решал. Кстати пару дней назад мне с "закрыть по крестику" очень здорово подсказали. И даже споры по поводу плохо ли не плохо пользовать icacls в итоге привели меня к написанию своего кода и сейчас я довольно неплохо уже разбираюсь в правах доступа на объекты на программном уровне после того спора. Так что общение именно в данной ветке на пользу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2014, 12:59 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38636578&tid=2019487]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
79ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 317ms |
| total: | 481ms |

| 0 / 0 |
