修改 Windows 7 库的 VBS 脚本在提升时不起作用
VBS script to modify a Windows 7 library does not work when elevated
大家好,感谢阅读我的问题。
我有一个简单的 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 文件,因此它似乎开始修改库但没有完成。
由于它是从单个脚本运行的,因此显然 运行同时使用 2 个脚本存在一些我不理解的问题。
再举一个例子,我刚刚创建了一个包含这两行的批处理文件:
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
中的开始菜单代码无法正常工作,并且并非所有程序菜单中的所有开始菜单项都会填充。
但同样,当我将两个脚本组合成一个脚本时,它工作正常。
不使用提升有时会解决问题,但并非总是如此,在 运行 启动器脚本再运行几次后,它又会崩溃。
我将一些 VBS 函数(创建 Windows 7 个库、填充开始菜单和创建连接点)转换为 PowerShell 脚本,此后我没有遇到任何问题。我 运行 来自主 VBScript 的 PowerShell 脚本(我 运行 提升)。
我不知道为什么这些脚本不能在 VBS 或 Batch 中正常工作,但由于 PowerShell 是一种更现代的语言,它可能是正确的方法,也是了解更多信息的好机会。
大家好,感谢阅读我的问题。
我有一个简单的 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 文件,因此它似乎开始修改库但没有完成。
由于它是从单个脚本运行的,因此显然 运行同时使用 2 个脚本存在一些我不理解的问题。
再举一个例子,我刚刚创建了一个包含这两行的批处理文件:
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
中的开始菜单代码无法正常工作,并且并非所有程序菜单中的所有开始菜单项都会填充。
但同样,当我将两个脚本组合成一个脚本时,它工作正常。
不使用提升有时会解决问题,但并非总是如此,在 运行 启动器脚本再运行几次后,它又会崩溃。
我将一些 VBS 函数(创建 Windows 7 个库、填充开始菜单和创建连接点)转换为 PowerShell 脚本,此后我没有遇到任何问题。我 运行 来自主 VBScript 的 PowerShell 脚本(我 运行 提升)。
我不知道为什么这些脚本不能在 VBS 或 Batch 中正常工作,但由于 PowerShell 是一种更现代的语言,它可能是正确的方法,也是了解更多信息的好机会。