1

好的,我会尝试再次问这个问题。我使用了这段代码:

Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\test", 1, "REG_DWORD"

我收到错误“注册表项中的根无效”代码:80070005(访问被拒绝)该代码适用于其他注册表根。我以管理员身份登录。当我从提升的命令提示符运行它时,它可以工作。但是我制作这个 VBS 是对朋友的恶作剧,让他不知道我在做什么。有任何想法吗?

4

2 回答 2

1

子 x86Win32ScriptingElevate()

在 WinXP 和 Win7 - 它工作正常:

      Call x86Win32ScriptingElevate()

    Dim WshShell
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\test", 1, "REG_DWORD"

    WScript.Quit


'*** v13.3 *** www.dieseyer.de *****************************
Sub x86Win32ScriptingElevate()
'***********************************************************
' http://dieseyer.de/scr/elevate.vbs
' Unter Windows x64 laufen VBS' nach einem Doppelklick in der x64-Umgebung
' mit %WinDi%\System32\wscript.exe oder mit %WinDi%\System32\cscript.exe.
' In der x64-Umgebung laufen VBS aber nicht (richtig). Die Prozedur
' x86Win32ScriptingElevate() erkennt dies und startet ggf. das VBS in der 
' x86-Umgebung mit 
' %WinDirr%\SysWOW64\wscript.exe bzw. mit
' %WinDirr%\SysWOW64\cscript.exe

  Dim VBSExe, Tst, TxtArg, i

' MsgBox WScript.FullName & vbCRLF & vbFalse & "..." & False & vbCRLF & wscript.arguments.named.exists("elevated"), , "173 :: "

  If wscript.arguments.named.exists("elevated") = True then Exit Sub


' Argumentte sammeln
  Dim Args      : Set Args      = Wscript.Arguments
  For  i = 0 to Args.Count - 1     ' hole alle Argumente
    TxtArg = TxtArg & " " & Args( i )
  Next
    TxtArg = Trim( TxtArg )
'   MsgBox ">" & TxtArg & "<", , "184 :: "

  VBSExe = UCase( WScript.FullName )

' x86- / Win32-Systeme haben KEIN %WinDir%\SysWOW64\ - Verzeichnis
  Tst = Replace( VBSExe, "\SYSTEM32\", "\SYSWOW64\" )
  If CreateObject("Scripting.FileSystemObject").FileExists( Tst ) Then VBSExe = Tst

' VBS mit /elevate starten - ggf. auf x64-System in Win32-Umgebung
' Msgbox """" & VBSExe & """ """ & WScript.ScriptFullName & """ " & TxtArg , , "196 :: "

  Tst = createobject("Shell.Application").ShellExecute( """" & VBSExe & """", """" & wscript.scriptfullname & """ " & TxtArg & " /elevated", "", "runas", 1 )

  WScript.Quit( Tst )

End Sub ' x86Win32ScriptingElevate()
于 2014-06-21T06:06:21.043 回答
1

分发注册表设置的最佳方法是使用注册表编辑器将注册表中此设置处于活动状态的部分导出到 .reg 文件。在导出对话框的保存部分,您选择 Win9x/NT4 作为格式。您可以使用编辑器检查 .reg 文件。用户只需双击 .reg 文件并确认提示并可能重新启动他的电脑。即使是普通用户也应该能够做到这一点。如果您尝试更改的注册表分支受安全保护,他将必须使用管理员权限执行此操作,并且可能(取决于操作系统版本)使用 regedt32.exe 可执行文件启动 regedit,并首先调整该分支的安全性,以便它可以改变了。

使用脚本执行此操作意味着必须通过额外的安全层以确保这不是恶意脚本。

于 2012-10-05T11:59:31.240 回答