提升Windows 7库的VBS脚本在提升时不起作用

时间:2019-01-27 01:27:54

标签: vbscript windows-7

大家好,感谢您阅读我的问题。

我有一个简单的VBS脚本,该脚本将Windows 7库从存储文件夹复制到Windows库文件夹,并在Windows资源管理器导航窗格中显示。

这里是:

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

问题是,当我从启动器脚本运行库脚本时,它经常(并非总是)无法正常工作。它会在Libraries文件夹中创建一个库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 :(得分:0)

我将一些VBS功能(创建Windows 7库,填充开始菜单和创建连接点)转换为PowerShell脚本,此后我没有任何问题。我从主VBScript(我以提升权限运行)运行PowerShell脚本。

我不知道为什么这些脚本无法在VBS或Batch中正常工作,但是由于PowerShell是一种更现代的语言,因此这可能是正确的选择,这也是了解它的好机会。