vbscript - 将 CurrentDirectory 从未提升的脚本传输到提升的脚本

标签 vbscript uac

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

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

Set shell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")

CurrentDirectory = fso.GetAbsolutePathName(".")
sourcefile = fso.buildpath(CurrentDirectory, "manufacturer.bmp")
MsgBox(sourcefile)

'Checks if the script is running elevated (UAC)
Function isElevated
  Set shell = CreateObject("WScript.Shell")
  Set whoami = shell.Exec("whoami /groups")
  Set whoamiOutput = whoami.StdOut
  strWhoamiOutput = whoamiOutput.ReadAll

  If InStr(1, strWhoamiOutput, "S-1-16-12288", vbTextCompare) Then 
    isElevated = True
  Else
    isElevated = False
  End If
End Function

'Re-runs the process prompting for priv elevation on re-run
Sub uacPrompt
  'Check if we need to run in C or W script
  interpreter = "wscript.exe"
  If InStr(1, WScript.FullName, "CScript", vbTextCompare) = 0 Then
    interpreter = "wscript.exe"
  Else
    interpreter = "cscript.exe"
  End If

  'Start a new instance with an elevation prompt first
  Set shellApp = CreateObject("Shell.Application")
  shellApp.ShellExecute interpreter, Chr(34) & WScript.ScriptFullName & _
    Chr(34) & " uac", "", "runas", 1

  'End the non-elevated instance
  WScript.Quit
End Sub

'Make sure we are running elevated, prompt if not
If Not isElevated Then uacPrompt

destinationdir = fso.buildpath(shell.ExpandEnvironmentStrings("%windir%"), _
                 "system32")
MsgBox(destinationdir)

fso.CopyFile sourcefile, destinationdir

知道如何将我的源文件 var 推送到子提升脚本吗?

最佳答案

ShellExecute方法允许您将工作目录指定为第三个参数,因此您可以将当前目录传递给提升的脚本并在提升后构建 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 & "\"

编辑:或者至少在您不提升流程的情况下它会这样工作。根据this blog post Raymond Chen 表示,提升进程时会忽略起始目录,因此当前目录中的恶意 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) & <b>" " & _
      Chr(34) & sh.CurrentDirectory & Chr(34), ,</b> "runas", 1
    WScript.Quit 0
  Else
    WScript.Echo "Privilege elevation failed!"
    WScript.Quit 1
  End If
End If

<b>sh.CurrentDirectory = WScript.Arguments(0)</b>

Set fso = CreateObject("Scripting.FileSystemObject")

src = fso.BuildPath(sh.CurrentDirectory, "manufacturer.bmp")
dst = fso.buildpath(sh.ExpandEnvironmentStrings("%windir%"), "system32")

fso.CopyFile src, dst & "\"

请注意,由于您的目标路径是一个文件夹,因此它必须结尾有一个反斜杠(如 documented )。

关于vbscript - 将 CurrentDirectory 从未提升的脚本传输到提升的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30469700/

相关文章:

javascript - 如何构建 javascript 字符串,以便 vbScript Split 将其拆分回数组中?

email - 每30分钟执行一次vbs

vbscript - 通过路径而不是名称检索具有多个用户的进程的 PID

delphi - 来自已提升应用程序的 UAC 提示

vba - 当我们使用Excel vba中的Dir函数循环遍历文件夹(文件)时,是否有类似于 'Find'的方法可用?

java - 访问 Outlook 表单和 Exchange Web 服务中的自定义字段

c++ - 如何检查不是 "self"的进程的组成员身份?

c++ - 以标准用户身份打开默认浏览器 (C++)

winapi - SendInput 在 UAC 提示时失败

windows-7 - 如何在 Windows 7 上从 Inno Setup 安装程序执行 "net use"命令?