101

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Господа, я прошу прощения, но я не полностью понимаю ход ваших мыслей и в частности, что такое "инлайновый метод".
Давайте я ещё раз сформулирую стоящую передо мной задачу:
Мне надо прикрепить программу на панель задач с помощью одной строки кода без дополнительных файлов. Путь к этому файлу известен заранее. Код запускается из конфигурационного файла SFX-модуля 7-zip. Код планируется запускать через mshta. То есть в конфигурационном файле должна быть строка вида:

RunProgram="mshtа <код>"

В такой записи, насколько мне известно, есть ограничение на длину кода.

Насколько я понял здесь и здесь предложены рабочие варианты кода? Или их работоспособность надо ещё проверить на иноязычних системах?

102

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Под инлайновым Xameleon имеет ввиду однострочник.

Насчёт рабочих вариантов. На 7-ке мой вариант уже можно не проверять. См. 10-ку. Есть mui из неё?

103

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

У меня 10 rus. Подойдет из неё? Или надо другие языки?

104

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Подойдёт. Хотя можно ещё парочку. А со сменой локали ничего не появилось?

105

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Что-то у меня ваш скрипт на 10 вылетает с ошибкой:

Сценарий:	G:\XP\MyInstallers\7z\!!!Tools\1.vbs
Строка:	20
Символ:	27
Ошибка:	Недопустимый вызов или аргумент процедуры
Код:	800A0005
Источник: 	Ошибка выполнения Microsoft VBScript

Opera.exe и в Program Files и в Program Files(x86).
Вот shell32.dll.mui из моей системы.
Немного не понял про смену локали - вы имеете в виду систему с несколькими языками?

106

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
А, забыл, что там нет одной нулёвки. Тогда не буду обрезать цикл. Всё равно на фоне процесса прикрепления это неощутимые миллисекунды. См. сейчас.
Про смену - верно. Я же привёл команду в скобках.

107

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Попробовал исправленный скрипт - ошибки нет, но не прикрепляется... Скрипт просто завершается без видимых последствий...
Про смену локали - у меня не установлено ни одной мультиязычной системы. На моих системах предлагается изменить язык системы только для программ не поддерживающих Юникод.

108

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Если ярлык с таким именем уже есть в папке, то дубль прикрепляться не будет.
Нужно изъять с панели перед тестом.

109

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Я, конечно же, предварительно открепил оперу от панели задач. Потом ещё запустил поиск ярлыков оперы в C:\Users - ничего не нашел.
Проверил на 8 - все работает. Может у меня 10 загаженная? Попробую завтра установить начисто на виртуалке...

110

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Вставьте MsgBox True между 8 и 9 строками. Появится сообщение?

111

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Я вставил туда

msgbox(Link)
msgbox(WSS.Environment("Process")("PROGRAMFILES") & "\Opera\Opera.exe")

Все отображается - и путь к ярлыку и путь к опере. Поэтому я и грешу на загаженость системы.

112

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Туда - это конкретно между 8 и 9 строками?
Тогда Msgbox Verb между двумя циклами (18, 19 строками).

113

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
На первый вопрос - ответ "да".

Flasher пишет:

Тогда Msgbox Verb между двумя циклами (18, 19 строками).

Выдает "&Закрепить на панели задач".

114

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Т.е. код верный. Можно убрать проверочное. Есть вероятность, что метод DoIt просто не успевает выполнить команду. Я с таким раньше сталкивался при вызове диалогов. Попробуйте в конце кода задержку секунды на 3 добавить:

WSH.Sleep 3000

115

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Задержка не помогла. Вставил ещё один Msgbox:

....
 		For Each V In Opera.Verbs
Msgbox V.Name
 			If V.Name = Verb Then V.DoIt : Exit For
 		Next
....

И вот, что интересно - "&Закрепить на панели задач" не появилось. Посмотрел по ПКМ - удивительно, но в Проводнике "&Закрепить на панели задач" есть, а в TotalCommander-e  - нет.

116

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Не появилось? Но тогда и эта строка не может там работать. ПКМ на .exe у меня в ТС прекрасно всё отображает. И к работе скрипта это в любом случае отношения не имеет.

117

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher пишет:

И к работе скрипта это в любом случае отношения не имеет.

Вот и я грешу на свою систему, а не на скрипт... Буду экспериментировать.
Теперь вопрос, как преобразовать ваш скрипт в однострочник? Меня смущает Exit For в 16 и 20 строках...

118 (изменено: koros, 2017-02-15 11:00:55)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
И еще просьба: Не могли бы вы пояснить, почему в 3 строке NameSpace(0) (насколько я понял - это папка "Рабочий стол"). Разве здесь не надо использовать ту же папку, что и в ParseName?

119

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros

Set WSS=CreateObject("WScript.Shell"):VPlus=WSS.RegRead("HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion")>"5.1":Set Opera=CreateObject("Shell.Application").NameSpace(0).ParseName(WSS.Environment("Process")("PROGRAMFILES")&"\Opera\Opera.exe"):If VarType(Opera)=9 Then WSH.Quit:End If:If VPlus Then Chain="User Pinned\TaskBar\":End If:Desc=Opera.ExtendedProperty("FileDescription"):Link=WSS.Environment("Process")("APPDATA")&"\Microsoft\Internet Explorer\Quick Launch\"&Chain&Desc&".lnk":If Not CreateObject("Scripting.FileSystemObject").FileExists(Link) Then:If VPlus Then:With CreateObject("MSXML2.XMLHTTP"):.Open "GET","res://shell32.dll/6/337",False:.Send:B=.ResponseBody:.Abort:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:For Each V In Opera.Verbs:If V.Name=Verb Then V.DoIt:Exit For End If:Next:Else:With WSS.CreateShortcut(Link):.TargetPath=Opera.Path:.Description=Desc:.Save:End With:End If:End If

В ParseName располагается путь относительно NameSpace. Поэтому там может быть как полный путь (при 0-е), так и относительный.
С 0-м запись короче. И в ряде случаев, когда перебираешь файлы в структуре, куда проще подставлять переменную с путём к уже полученному объекту папки.

120

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Спасибо. Но этот код не запускается через mshta. Я думаю, что это из-за того, что он слишком длинный.
Пока попытался запустить через mshta только основополагающую часть:

mshta vbscript:execute("With CreateObject(""MSXML2.XMLHTTP""):.Open ""GET"",""res://shell32.dll/6/337"",False:.Send:B=.ResponseBody:.Abort:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:Close")

Выдаёт ошибку, что "Разрешение отклонено".
Эта же ошибка вылетает даже, если просто запустить:

mshta vbscript:execute("With CreateObject(""MSXML2.XMLHTTP""):.Open ""GET"",""res://shell32.dll/6/337"",False:.Send:B=.ResponseBody:.Abort:End With:Close")

121

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Не понял, в чём состоит основоположность (кроме записи в переменную там ничего по сути нет), ну ладно.
Я бы рад помочь с mshta, но у меня там другой описанный ранее глюк с выводом окна. Никаких ошибок нв Win7 не наблюдаю.
Кстати, без mshta работает?

122

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Основоположность - в сути метода. То есть определение "глагола" через res://shell32.dll/6/337.
Я проверил код без mhta:

With CreateObject("MSXML2.XMLHTTP"):.Open "GET","res://shell32.dll/6/337",False:.Send:B=.ResponseBody:.Abort:End With
msgbox b

Работает.
Через mshta:

mshta vbscript:execute("With CreateObject(""MSXML2.XMLHTTP""):.Open ""GET"",""res://shell32.dll/6/337"",False:.Send:B=.ResponseBody:.Abort:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:msgbox b:Close")

Выдает ошибку "Разрешение отклонено".
Может CreateObject(""MSXML2.XMLHTTP"") не работает черех mshta. Например, насколько я знаю, объекта WScript в mshta нет и, например, WScript.Quit не работает через mshta.

123

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Немного модифицировал код Flasher-a в плане чтения.


mshta vbscript:execute("With CreateObject(""CDO.Message"").AddAttachment(""res://shell32.dll/6/337"").GetDecodedContentStream:.Type=1:B=.Read:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then Verb=MidB(B,i+2,L*2):Exit For End If:i=i+L*2+1:Next:msgbox b:Close")

У меня на Win 10 выдаёт:

Открыть с помощь&юОткрыть с помощь&ю...&Выбрать другое приложение2Открытие документа с помощью конкретной программы."Открытие документа с помощью "%s". &Выбрать приложение по умолчанию&Поиск в Магазине'Открытие Магазина для поиска приложения'Добавление этого элемента в меню "Пуск"&Удаление этого элемента из меню "Пуск"&Закрепить на панели задач&Открепить от панели задач*Закрепляет это приложение на панели задач.)Открепляет это приложение с панели задач.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

124

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Я имел в виду мой код, а не данный кусок.

koros пишет:

Может CreateObject(""MSXML2.XMLHTTP"") не работает черех mshta.

Так проверьте:

mshta vbscript:execute("Set XML=CreateObject(""MSXML2.XMLHTTP""):Close")
koros пишет:

WScript.Quit не работает через mshta.

Если речь про WSH.Quit в моём коде, то вместо него всю нижеследующую часть кода можно завернуть в условие:

If VarType(Opera) = 8 Then
...
End If

Xameleon
Verb вместо b в конце.

125 (изменено: Xameleon, 2017-02-15 15:20:38)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher,

Verb вместо b в конце.

Ааа, вот оно в чём дело. Не обратил внимания. А у Вас в коде "MsgBox b" используется для отладки ?

Решил попробовать собрать свой вариант:

mshta vbscript:execute("With CreateObject(""CDO.Message"").AddAttachment(""res://shell32.dll/6/337"").GetDecodedContentStream:.Type=1:Do While Not.EOS:l=AscB(.Read(2))*2:n=n+1:if l>0 Then v=.Read(l):if n=11 Then msgbox v:Exit Do:End if:End if:Loop:End With:Close")
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

126

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Xameleon
Короче не стало. ) И на 7-ке будет та же проблема с l > 0, цикл прервётся раньше времени.

Xameleon пишет:

А у Вас в коде "MsgBox b" используется для отладки ?

Это не у меня. ))

127

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher пишет:

Я имел в виду мой код, а не данный кусок.

Ваш целиковый код работает.

Flasher пишет:

Так проверьте:

Так ошибок не возникает.
Xameleon большое спасибо - mshta заработало с

With CreateObject(""CDO.Message"").AddAttachment(""res://shell32.dll/6/337"").GetDecodedContentStream:.Type=1:B=.Read:End With

Поскольку mshta налагает ограничения на длину кода и путь я знаю заранее (C:\Program Files\Opera\Opera.exe - приведен для примера) и  будет автоматом подставляться в скрипт решил убрать проверки на версию системы за пределы mshta. Также скрипт разделяется на две части - создание ярлыка и присвоение ему прав администратора (с чего собственно все и начиналось), чтобы была возможность создавать ярлыки с и без прав администратора. В итоге получился такой скрипт для прикрепления программы к ранели задач без прав администратора:

mshta vbscript:execute("With CreateObject(""CDO.Message"").AddAttachment(""res://shell32.dll/6/337"").GetDecodedContentStream:.Type=1:B=.Read:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then P=MidB(B,i+2,L*2):Exit For:End If:i=i+L*2+1:Next:For Each V In CreateObject(""Shell.Application"").NameSpace(0).ParseName(""C:\Program Files\Opera\Opera.exe"").Verbs:If V.Name=P Then V.DoIt::Exit For:End If:Next:Close")

Вроде все работает.
Насколько я понял для открепления от панели задач надо делать проверку на n=12?

Еще раз большое вам всем спасибо.

128 (изменено: Xameleon, 2017-02-15 15:51:57)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher,

1)

Короче не стало. )

Ну немного. )

2)

И на 7-ке будет та же проблема с l > 0, цикл прервётся раньше времени.


Не понял. Почему ? Только что проверил на Win 7. Нормально отработало.

3)

Это не у меня. ))

Японский трактор ! Точно ! Прям дежавю. ))

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

129

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros пишет:

и путь я знаю заранее

У себя дома? Или у других, где папка Program Files меняется?

koros пишет:

решил убрать проверки на версию системы за пределы mshta

Так а где она в приведённом коде учтена? И где в нём создание ярлыка на XP?

koros пишет:

Насколько я понял для открепления от панели задач надо делать проверку на n=12?

Это риторический вопрос?


Xameleon пишет:

Только что проверил на Win 7. Нормально отработало

Я могу проверять только отдельно от mshta. Так вот у меня скрипт отработал вхолостую.
Точки в посте проставьте.

130

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher,

Я могу проверять только отдельно от mshta. Так вот у меня скрипт отработал вхолостую.

1) Только что проверил отдельно от mshta. Тоже сработало без проблем. O_o

Точки в посте проставьте.

2) Исполнено. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

131

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Xameleon
А.. У меня два проверочных кода. Данный следовал за предыдущим и по какой-то причине не отрабатывал. Теперь подтверждаю. Всё в порядке.

132

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher,

Теперь подтверждаю. Всё в порядке. smile

Гут ! ) Значит всё не зря.

Я вот только всё думаю об одном моменте.... Там под размер вроде 2 байта выделено. , а у меня код читает только 1 байт. Т.е по идее при определённой длине строки может быть неожиданный результат.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

133

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Xameleon
Проверил на всех mui с 7-ки, что выложил koros, проблем нет.

134 (изменено: Xameleon, 2017-02-15 16:53:55)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher, ну для этих целей да. ) Всё отлично. Вот думаю допилить для двухбайтных.

Пока прикинул для ULONG.


Function b2un(b)
    Dim i: For i = 1 To LenB(b)
        b2un = b2un + AscB(MidB(b, i, 1)) * 2 ^ ((i - 1) * 8)
    Next
End Function

Но вдруг там будет знаковый LONG.... И тогда....

Но, пардон - это уже оффтоп в этой теме... Пойду думать в другую. )

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

135

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher пишет:

У себя дома? Или у других, где папка Program Files меняется?

Везде . Как я уже говорил - этот код нужен мне для конфигурационного файла для создания SFX 7-zip. Там вначале будет задаваться путь, а потом уже он будет использоваться для создания ярлыка. Например, путь будет задаваться, как %%T\Opera.exe. %%T - это внутренняя переменная модуля SFX 7-zip и она раскрывается, как путь, куда распаковывается содержимое архива.

Flasher пишет:

Так а где она в приведённом коде учтена?

Ну полная команда будет такова:

cmd /c VER|FIND "5.">nul||mshta vbscript:execute("With CreateObject(""CDO.Message"").AddAttachment(""res://shell32.dll/6/337"").GetDecodedContentStream:.Type=1:B=.Read:End With:For i=1 To LenB(B):n=n+1:L=AscB(MidB(B,i,2)):If n=11 Then P=MidB(B,i+2,L*2):Exit For:End If:i=i+L*2+1:Next:For Each V In CreateObject(""Shell.Application"").NameSpace(0).ParseName(""%%T\Opera.exe"").Verbs:If V.Name=P Then V.DoIt::Exit For:End If:Next:Close")

Это не окончательная запись в файле конфигурации.ю т.к.в нем надо задваивать слеши и экранировать слешами кавычки - привел в таком виде для удобства чтения.

Flasher пишет:

И где в нём создание ярлыка на XP?

На самом деле панель Quick Launch в привычном для нас виде присутствует не только в ХР, но и в системах после ХР, просто она там отключена. Создавать ярлык в Quick Launch можно штатными средствами модуля  SFX 7-zip, не смотря на версию системы и он никак не связан с ярлыком на панели задач.

Flasher пишет:

Это риторический вопрос?

Да я вроде посмотрел, какие "глаголы" считываются и в каком порядке. "Открепить от панели задач" идет вслед за "Закрепить на панели задач" - поэтому проверка на n=12. Проверил на 7 - работает. Но решил для уверенности спросить у знающих людей...

136

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros пишет:

На самом деле панель Quick Launch в привычном для нас виде присутствует не только в ХР, но и в системах после ХР, просто она там отключена.

Она не совсем в привычном виде. Чтобы её привести к должному виду, нужно ещё снять пару галок в меню и сдвинуть к меню Пуск, но в любом случае она останется неоткрепляемой и неизменной по числу рядов, как было ранее.

koros пишет:

Создавать ярлык в Quick Launch можно штатными средствами модуля  SFX 7-zip, не смотря на версию системы и он никак не связан с ярлыком на панели задач.

Так в прежних системах на панель задач отдельно от быстрого запуска ничего не крепилось. Логично, что там должна быть "аналогия" при установке.

Насчёт остального ясно.

137

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Кстати, до 10-ки были канонические глаголы taskbarpin и taskbarunpin (наравне с startpin и startunpin). Можно было бы сократить до:

cmd /c VER|FIND "5.">nul||mshta vbscript:execute("CreateObject(""Shell.Application"").NameSpace(&H26).ParseName(""Opera\Opera.exe"").InvokeVerb(""taskbarpin""):Close")

В своём коде сократил для разнообразия. В 10-ке какой-то хотфикс их отламывает. Советую проверить.
Про эти и другие глаголы.

138

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Извиняюсь, что долго не отвечал.
Проверил ваш последний код на 10 - действительно не работает. Так что придется остановиться на предыдущем варианте.
Спасибо за консультации.

139

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Понял. Ну, и на всякий случай проверьте, даст код число или нет:

MsgBox InStr(CreateObject("WScript.Shell").RegRead("HKCR\CLSID\{90AA3A4E-1CBA-4233-B8BB-535773D48449}\ImplementsVerbs"), "taskbarpin")

140

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Да этот код дает число 1.

141

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Хм. Интересно. А этот код блокнот (убрать, если есть) на таскбар не добавит?:

With GetObject("new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}")
   .document.Application.NameSpace(&H24).ParseName("notepad.exe").InvokeVerb "taskbarpin" : .Quit
End With

См. за точками.

142

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Да, добавляет....

Flasher пишет:

См. за точками.

Прошу прощения.

143

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Ну, так за чем дело встало? Остаётся проверить на Опере:

mshta vbscript:Execute("Set WB=GetObject(""new:{C08AFD90-F2A1-11D1-8455-00A0C91F3880}""):WB.document.Application.NameSpace(&H26).ParseName(""Opera\Opera.exe"").InvokeVerb""taskbarpin"":WB.Quit:close")

144 (изменено: koros, 2017-03-02 12:08:10)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher
Прошу прощения, что долго не отвечаю - сейчас в командировке и интернет доступен не регулярно.
Спасибо - так работает. Ещё вопросик: C08AFD90-F2A1-11D1-8455-00A0C91F3880 - это должно работать во всех Windows?

145

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

koros
Да. Это Shell Browser Window (подробнее) от WebBrowser2.

146 (изменено: koros, 2017-03-03 16:42:53)

Re: HTA, VBS: Ярлык на панель задач с запуском от имени администратора

Flasher и Xameleon, большое вам спасибо. В окончательном виде это применено здесь (если не сочтете за рекламу).