пятница, 19 июля 2013 г.

EventID 10016 и COM-объект InternetExplorer

Понадобилось на днях в планировщик добавить задачу на выполнение программы и столкнулся со следующей ошибкой в системном журнале Windows:

EventID 10016
Параметры разрешений по умолчанию не дают разрешения Локальный Активация для приложения COM-сервера с CLSID
{0002DF01-0000-0000-C000-000000000046}
 и APPID
Недоступен
 пользователю DOMAIN\User с SID (S-1-5-21-392298462-15684764-2655755672-2605) и адресом LocalHost (с использованием LRPC). Это разрешение безопасности можно изменить с помощью служебной программы управления службами компонентов.
                                            
Поиск по ID в реестре показал, что данный идентификатор принадлежит объекту InternetExplorer.Application. Через оснастку DCOM (dcomcnfg) права дать не получилось, как это обычно делается в подобных случаях, поскольку такого объекта там не оказалось.
Программа создаёт объект IE и что-то там по ссылке проверяет, но при создании объекта, вываливается ошибка о нехватке прав. Раньше задача запускалась с правами локального админа и всё работало хорошо. Но косяк с лишними правами было решено исправить. В итоге, под пользовательской учёткой и получили эту ошибку.  Причём, если запускать программу вручную под пользовательской учёткой также всё работает, но нам нужен запуск по расписанию.
Для теста создал простенький скрипт на VBS, вызывающий IE и переходящий по ссылке в Интернете:

Set WshShell = WScript.CreateObject("WScript.Shell")
Set oIE = WScript.CreateObject("InternetExplorer.Application")

oIE.menubar = 1
oIE.toolbar = 0
oIE.statusbar = 0

' Открываем пустую страницу
oIE.navigate "about:blank"
' Пауза. Без неё окно не ищется :(
wscript.sleep 10
' Делаем окно видимым
oIE.visible = 1
' Окно на передний план
success = WshShell.appactivate("Пустая страница - Windows Internet Explorer")
' Максимизируем
if success then WshShell.sendkeys "% р"
' Опять немного надо поспать
wscript.sleep 10
' Открываем IE
oIE.navigate "http://ya.ru"
'Меняем заголовок окна, если нужно
'oIE.Document.Title = "yandex"


И запихал его в планировщик, проблема повторилась под пользовательской учёткой. Под учёткой админа всё работает. Если запускать вручную всё работает в обоих случаях. Ладно, дал права админа пользовательской учётке – проблема осталась. Странно….
С помощью ProcMon отследить проблему не удалось L
В общем, путём перебора различных вариантов выяснилось, что нужно первый раз запускать программу через планировщик под учёткой с правами локального админа,  а потом права можно забрать. Всё будет работать. Если же первый раз создать объект IE через планировщик под учёткой с пользовательскими правами, то потом какие права не давай, работать не будет.