Running NSIS Setup with username and password
我如何在NSIS脚本中集成用户名和密码,以使其能够以管理员身份运行?
我有一个简单的NSIS脚本,可以将我的应用程序文件复制到程序文件中。该脚本在管理员模式下工作。我必须使用admin(管理员)和密码(CorpPass @ 2424)将其安装在多台计算机上,而无需提供UAC对话框。
示例脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | # This installs two files, app.exe and logo.ico, creates a start menu shortcut, builds an uninstaller, and # adds uninstall information to the registry for Add/Remove Programs # To get started, put this script into a folder with the two files (app.exe, logo.ico, and license.rtf - # You'll have to create these yourself) and run makensis on it # If you change the names"app.exe","logo.ico", or"license.rtf" you should do a search and replace - they # show up in a few places. # All the other settings can be tweaked by editing the !defines at the top of this script !define APPNAME"TEST App Name" !define COMPANYNAME"TEST NAME" !define DESCRIPTION"A short description goes here" # These three must be integers !define VERSIONMAJOR 1 !define VERSIONMINOR 1 !define VERSIONBUILD 1 # These will be displayed by the"Click here for support information" link in"Add/Remove Programs" # It is possible to use"mailto:" links in here to open the email client !define HELPURL"http://..." #"Support Information" link !define UPDATEURL"http://..." #"Product Updates" link !define ABOUTURL"http://..." #"Publisher" link # This is the size (in kB) of all the files copied into"Program Files" !define INSTALLSIZE 7233 RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on) InstallDir"$PROGRAMFILES\\${COMPANYNAME}\\${APPNAME}" # rtf or txt file - remember if it is txt, it must be in the DOS text format (\ \ ) LicenseData"license.rtf" # This will be in the installer/uninstaller's title bar Name"${COMPANYNAME} - ${APPNAME}" Icon"logo.ico" outFile"sample-installer.exe" !include LogicLib.nsh # Just three pages - license agreement, install location, and installation page license page directory Page instfiles !macro VerifyUserIsAdmin UserInfo::GetAccountType pop $0 ${If} $0 !="admin" ;Require admin rights on NT4+ messageBox mb_iconstop"Administrator rights required!" setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED quit ${EndIf} !macroend function .onInit setShellVarContext all !insertmacro VerifyUserIsAdmin functionEnd section"install" # Files for the install directory - to build the installer, these should be in the same directory as the install script (this file) setOutPath $INSTDIR # Files added here should be removed by the uninstaller (see section"uninstall") file"app.exe" file"logo.ico" # Add any other files for the install directory (license files, app data, etc) here # Uninstaller - See function un.onInit and section"uninstall" for configuration writeUninstaller"$INSTDIR\\uninstall.exe" # Start Menu createDirectory"$SMPROGRAMS\\${COMPANYNAME}" createShortCut"$SMPROGRAMS\\${COMPANYNAME}\\${APPNAME}.lnk""$INSTDIR\\app.exe""""$INSTDIR\\logo.ico" sectionEnd # Uninstaller function un.onInit SetShellVarContext all #Verify the uninstaller - last chance to back out MessageBox MB_OKCANCEL"Permanantly remove ${APPNAME}?" IDOK next Abort next: !insertmacro VerifyUserIsAdmin functionEnd section"uninstall" # Remove Start Menu launcher delete"$SMPROGRAMS\\${COMPANYNAME}\\${APPNAME}.lnk" # Try to remove the Start Menu folder - this will only happen if it is empty rmDir"$SMPROGRAMS\\${COMPANYNAME}" # Remove files delete $INSTDIR\\app.exe delete $INSTDIR\\logo.ico # Always delete uninstaller as the last action delete $INSTDIR\\uninstall.exe # Try to remove the install directory - this will only happen if it is empty rmDir $INSTDIR # Remove uninstaller information from the registry DeleteRegKey HKLM"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\${COMPANYNAME} ${APPNAME}" sectionEnd |
如果您具有管理员ID和密码,则可以直接验证并执行命令
VB脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | dim WshShell,FSO ,currDir set WshShell = CreateObject("WScript.Shell") set WshEnv = WshShell.Environment("Process") WinPath = WshEnv("SystemRoot")&"\\System32\ unas.exe" set FSO = CreateObject("Scripting.FileSystemObject") currDir = FSO.GetAbsolutePathName(".") sUser="Admin" sPass="Password_123"&VBCRLF sCmd= currDir &"\\MySetup.exe" if FSO.FileExists(winpath) then 'wscript.echo winpath &"" &"verified" else set WshShell=Nothing set WshEnv=Nothing set FSO=Nothing wscript.quit end if rc=WshShell.Run("runas /user:" & sUser &"" & CHR(34) & sCmd & CHR(34), 2, FALSE) Wscript.Sleep 90 WshShell.AppActivate(WinPath) WshShell.SendKeys sPass set WshShell=Nothing set WshEnv=Nothing set FSO=Nothing wscript.quit |
您无法绕过UAC,已经有一个用户与安全桌面上的UAC对话框进行交互。
在Windows 2000 / XP / 2003上,您可以使用runas / CreateProcessAsUser以其他用户身份启动新进程,并且在那些系统上可以提升为管理员(在2003年,此举不太可能起作用,因为您可能不会这样做。拥有所需的特权)。在Vista上这是不可能的,因为UAC引入了拆分令牌,这意味着,属于管理员组成员的用户实际上不是具有完全访问权限的管理员,除非他们通过UAC对话框并"解锁"无限令牌。 >
如果您只需要以特定用户身份启动新进程,则仍然可以使用LogonUser CreateProcessAsUser来完成,但是如果您的起点不是高架进程,则它不允许您绕过UAC并获得无限的管理员令牌。 。
作为系统运行的NT服务可以访问无限令牌,但这当然意味着您必须至少提升一次UAC才能首先安装该服务...