我需要复制我的文件" manufacturer.bmp",它与脚本(在我的闪存驱动器中)位于同一目录中,位于system32
目录。
我成功了,获取变量sourcefile
,destinationdirectory
并提升我的脚本,但是当我提升它时,我的sourcefile
变量会丢失,因为使用了{ {1}},在此模式下有所不同。
CurrentDirectory
如何将我的sourcefile var推送到子提升脚本?
答案 0 :(得分:2)
ShellExecute
方法允许您将工作目录指定为3 rd 参数,因此您可以将当前目录传递给提升的脚本并构建sourcefile
路径升高后。此外,您的代码可以简化一些。
Const HKLM = &h80000002
Const DELETE = &h10000
Set sh = CreateObject("WScript.Shell")
Set reg = GetObject("winmgmts://./root/default:StdRegProv")
reg.CheckAccess HKLM, "SYSTEM\CurrentControlSet", DELETE, isAdmin
If Not isAdmin Then
If WScript.Arguments.Count = 0 Then
CreateObject("Shell.Application").ShellExecute WScript.FullName, _
Chr(34) & WScript.ScriptFullName & Chr(34) & " uac", _
sh.CurrentDirectory, "runas", 1
WScript.Quit 0
Else
WScript.Echo "Privilege elevation failed!"
WScript.Quit 1
End If
End If
Set fso = CreateObject("Scripting.FileSystemObject")
src = fso.BuildPath(sh.CurrentDirectory, "manufacturer.bmp")
dst = fso.buildpath(sh.ExpandEnvironmentStrings("%windir%"), "system32")
fso.CopyFile src, dst & "\"
编辑:或者至少就是如果你没有提升过程的话。根据Raymond Chen的this blog post,在提升进程时会忽略启动目录,因此当前目录中的恶意DLL不会被错误地加载到提升的进程中。这意味着您必须“手动”传递工作目录,如下所示:
Const HKLM = &h80000002
Const DELETE = &h10000
Set sh = CreateObject("WScript.Shell")
Set reg = GetObject("winmgmts://./root/default:StdRegProv")
reg.CheckAccess HKLM, "SYSTEM\CurrentControlSet", DELETE, isAdmin
If Not isAdmin Then
If WScript.Arguments.Count = 0 Then
CreateObject("Shell.Application").ShellExecute WScript.FullName, _
Chr(34) & WScript.ScriptFullName & Chr(34) & " " & _
Chr(34) & sh.CurrentDirectory & Chr(34), , "runas", 1
WScript.Quit 0
Else
WScript.Echo "Privilege elevation failed!"
WScript.Quit 1
End If
End If
sh.CurrentDirectory = WScript.Arguments(0)
Set fso = CreateObject("Scripting.FileSystemObject")
src = fso.BuildPath(sh.CurrentDirectory, "manufacturer.bmp")
dst = fso.buildpath(sh.ExpandEnvironmentStrings("%windir%"), "system32")
fso.CopyFile src, dst & "\"
请注意,由于您的目标路径是文件夹,因此必须具有尾部反斜杠(documented)。