将CurrentDirectory从未提升的脚本转移到提升的脚本

时间:2015-05-26 22:01:03

标签: vbscript uac

我需要复制我的文件" manufacturer.bmp",它与脚本(在我的闪存驱动器中)位于同一目录中,位于system32目录。

我成功了,获取变量sourcefiledestinationdirectory并提升我的脚本,但是当我提升它时,我的sourcefile变量会丢失,因为使用了{ {1}},在此模式下有所不同。

CurrentDirectory

如何将我的sourcefile var推送到子提升脚本?

1 个答案:

答案 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)。