Сценарий VBS для изменения библиотеки Windows 7 не работает при повышении - PullRequest
0 голосов
/ 27 января 2019

Привет всем и спасибо за чтение моего вопроса.

У меня есть простой сценарий VBS, который копирует библиотеку Windows 7 из папки хранилища в папку библиотек Windows и показывает ее на панели навигации Windows Explorer.

Вот оно:

Option Explicit

Dim wsnet, shell, fso, shellapp, objFolder, objFolderItem, verb, username

' Setup variables
Set wsnet    = WScript.CreateObject("WScript.Network")
Set shell    = WScript.CreateObject("WScript.Shell")
Set fso      = CreateObject("Scripting.FileSystemObject")
Set shellapp = CreateObject("Shell.Application")
username     = UCase(wsnet.Username)

' Remove read only flag from local copy of library
shell.Run ("attrib -R ""C:\Users\" & username & "\AppData\Roaming\Microsoft\Windows\Libraries\Books.library-ms"""), 0, True

' Copy library file from storage to local
fso.CopyFile "D:\Home\Seven\Libraries\Books.library-ms", "C:\Users\" & username & "\AppData\Roaming\Microsoft\Windows\Libraries\", Rrue

' Show local library in navigation pane
Set objFolder = shellapp.Namespace("C:\Users\" & username & "\AppData\Roaming\Microsoft\Windows\Libraries")
Set objFolderItem = objFolder.ParseName("Books.library-ms")
For Each verb In objFolderItem.Verbs()
    If Replace(verb.Name, "&", "") = "Show in navigation pane" Then
        verb.DoIt()
    End If
Next

Теперь, когда я запускаю скрипт библиотеки выше, он работает абсолютно нормально и никогда не сообщает об ошибках.

Однако у меня есть другой VBScript, который просто запускает библиотечный скрипт. Он работает сам поднят, используя функцию возвышения. Вот оно:

Option Explicit

Dim bElevate, shell

' Run logon script with elevated permissions under UAC
bElevate = False
If WScript.Arguments.Count > 0 Then If WScript.Arguments(WScript.Arguments.Count-1) <> "|" Then bElevate = True
If bElevate Or WScript.Arguments.Count = 0 Then ElevateUAC

' Setup variables
Set shell = WScript.CreateObject("WScript.Shell")
shell.Run "D:\Home\Seven\Scripts\Logon\buildLibraries.vbs", 0, False

' Run script with elevated privelages (used to ensure logon script runs under UAC)
Sub ElevateUAC
    Dim sParms, oShell
    sParms = " |"
    If WScript.Arguments.Count > 0 Then
        For i = WScript.Arguments.Count-1 To 0 Step -1
            sParms = " " & WScript.Arguments(i) & sParms
        Next
    End If
    Set oShell = CreateObject("Shell.Application")
    oShell.ShellExecute "cscript.exe ", "//NoLogo " & WScript.ScriptFullName & sParms, , "runas", 1
    WScript.Quit
End Sub

Проблема в том, что когда я запускаю скрипт библиотеки из скрипта запуска, он часто (не всегда) не работает должным образом. Он создает файл библиотеки TMP в папке «Библиотеки», поэтому кажется, что он начинает изменять библиотеку, но не завершает работу.

Поскольку он работает из одного скрипта, существует определенная проблема с запуском двух скриптов одновременно, которую я не понимаю.

В другом примере я только что создал командный файл, содержащий эти две строки:

call C:\Windows\System32\cscript /B //NoLogo D:\Home\Seven\Scripts\Logon\logonseven.vbs
call C:\Windows\System32\cscript /B //NoLogo D:\Home\Seven\Scripts\Logon\startmenu.vbs

logonseven.vbs - это основной скрипт входа в систему, который выполняет много-много вещей (тысячи строк). Он заполняет раздел «Все программы» меню «Пуск» (не закрепленный список, а меню «Все программы»).

startmenu.vbs просто добавляет несколько ярлыков в закрепленный список меню «Пуск» Windows 7, используя обычный метод глагола, как показано ниже:

Function pin(path, exec)
    Set objFolder = shellapp.Namespace(path)
    Set objFolderItem = objFolder.ParseName(exec)
    For Each verb In objFolderItem.Verbs() 
        If Replace(verb.Name, "&", "") = "Pin to Start Menu" Then verb.DoIt()
    Next
End Function

logonseven.vbs поднимет себя. startmenu.vbs не будет повышен.

Когда я запускаю оба сценария вместе из командного файла, иногда код меню «Пуск» в logonseven.vbs не работает должным образом, и не все пункты меню «Пуск» в меню «Все программы» заполняются.

Но опять же, когда я объединяю оба сценария в один сценарий, он работает нормально.

Если не использовать повышение прав, это иногда решает проблему, но не всегда, и после запуска сценария запуска еще несколько раз он снова выходит из строя.

1 Ответ

0 голосов
/ 08 февраля 2019

Я преобразовал некоторые функции VBS (создание библиотек Windows 7, заполнение меню «Пуск» и создание точек соединения) в сценарии PowerShell, и с тех пор у меня не было никаких проблем.Я запускаю скрипты PowerShell из основного VBScript (который я запускаю с повышенными правами).

Я не знаю, почему скрипты не работают должным образом из VBS или Batch, но поскольку PowerShell - гораздо более современный язык, онвероятно, правильный путь, и это хорошая возможность узнать больше об этом.

...