user1157977
user1157977

Reputation: 917

Is is possible to have RUN AS prompt for vbscript?

I have this vbscript which changes the registry values and i want it to be able to run as another account(with admin rights) in a standard windows user account. Is it possible to code it such that when u double click on the vbscript, it will ask for yr windows account name and password then u be able to run the script with that account rights?

Thanks!

Upvotes: 1

Views: 3937

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200363

In the old days you could add a runas key to the respective file type in the registry:

reg add "HKCR\VBSFile\Shell\runas\Command" /ve /t REG_EXPAND_SZ ^
  /d "\"%"SystemRoot"%\system32\wscript.exe\" \"%1\" %*" /f

which would add a Run as… entry to the context menu that would prompt you for credentials.

Unfortunately, Microsoft changed the "runas" behavior when they introduced UAC. Now the registry key adds a Run as Administrator entry to the context menu, that will work only with UAC enabled.

Sysinternals to the rescue (as always): you can re-enable the context menu entry for running as a different user with ShellRunas. Download the archive, unzip the executable to a directory in your %PATH% and run ShellRunas.exe /reg to register the program. That will add a Run as different user… context menu entry for executables only, though. To add this entry for VBScript files as well you need to add the relevant registry keys/values yourself, e.g. like this:

reg add "HKCR\VBSFile\Shell\runasuser" /ve /t REG_SZ /d "@shell32.dll,-50944" /f
reg add "HKCR\VBSFile\Shell\runasuser\command" /v DelegateExecute /t REG_SZ ^
  /d "{ea72d00e-4960-42fa-ba92-7792a7944c1d}" /f

or by merging a .reg file like this:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\VBSFile\Shell\runasuser]
@="@shell32.dll,-50944"

[HKEY_CLASSES_ROOT\VBSFile\Shell\runasuser\command]
"DelegateExecute"="{ea72d00e-4960-42fa-ba92-7792a7944c1d}"


There is no elegant way for incorporating this in a VBScript, though. If your system has UAC enabled, you could check if your user already has admin privileges (verification method adopted from here) and otherwise re-launch the script using the ShellExecute method with the "runas" verb:

Set reg = GetObject("winmgmts://./root/default:StdRegProv")
rc = reg.GetStringValue(&h80000003, "S-1-5-19\Environment", "TEMP", val)
If rc = 5 Then
  'return code 5 == access denied
  're-launch script only when it was run without arguments, so we don't go
  'in circles when admin privileges can't be acquired
  If WScript.Arguments.Count = 0 Then
    're-launch as administrator; the additional argument is a guard to make
    'sure the script is re-launched only once
    CreateObject("Shell.Application").ShellExecute "wscript.exe" _
      , Chr(34) & WScript.ScriptFullName & Chr(34) & " relaunch", "", "runas", 1
    WScript.Quit 0
  Else
    WScript.Echo "Cannot acquire admin privileges."
    WScript.Quit 1
  End If
Else
  'your code here
End If

With UAC disabled, you'd need to prompt for credentials via InputBox (bad) or with a custom password dialog (better). Either way, you'd need to re-launch the script via runas.exe

Set sh = CreateObject("WScript.Shell")
sh.Run "runas /user:" & username & " cscript """ & WScript.ScriptFullName & """"

and type in the password via SendKeys (which is a bad idea in its own right).

Upvotes: 1

Related Questions