-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsudow.cmd
158 lines (131 loc) · 4.08 KB
/
sudow.cmd
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
@ECHO OFF
REM ===========================================================
REM @file
REM
REM @brief Automatically check & obtain admin rights.
REM
REM @version 1.0
REM @author Wei Tang <[email protected]>
REM @date 2020-07-19
REM
REM @copyright Copyright (c) 2020.
REM National Key Laboratory of Science and Technology on Communications,
REM University of Electronic Science and Technology of China.
REM All rights reserved.
REM
REM @see <a href="http://stackoverflow.com/users/1016343/matt">Matt</a>
REM @see <a href="http://stackoverflow.com/questions/7044985/how-can-i-auto-elevate-my-batch-file-so-that-it-requests-from-uac-admin-rights">link</a>
REM ===========================================================
REM This script use `NET FILE` to check administrator rights.
REM If the administrator rights is not obtained, then
REM * The command line to execute is stored in `_ELEV_CMD_`.
REM * Create a temporary VBS script, the path is stored in `_ELEV_VBS_`.
REM This script uses Windows `Shell` to invoke this script with a single
REM argument `_ELEV_`, with administrator rights.
REM * When administrator rights are obtained, the current environment variables
REM are lost, in order to recall `_ELEV_CMD_`, the environment variables are
REM stored in a temporary batch file `_ELEV_ENV_`.
REM When this script is invoked with administrator rights, and the command line
REM argument is `_ELEV_`, it invokes `_ELEV_CMD_` to recall the environment
REM variables.
REM Then `_ELEV_CMD_` is invoked appropriately.
CALL :TestPriviledges
IF "%~1"=="_TEST_" (
EXIT /B ERRORLEVEL
)
IF ERRORLEVEL 1 (
REM Try to run this script as administrator.
CALL :GetPrivileges %*
) ELSE (
REM Run this script as administrator.
CALL :RunAsAdmin %*
)
REM PAUSE
EXIT /B
:: ========= Test Access Right Begin =========
:TestPriviledges
NET FILE 1>NUL 2>NUL
EXIT /B %ERRORLEVEL%
:: ========= Test Access Right End =========
:: ========= Elevate Access Right Begin =========
:GetPrivileges
ECHO Require administrator privileges, try to obtain...
SET "_ELEV_VBS_=%TEMP%\_Elev_.vbs"
SET "_ELEV_ENV_=%TEMP%\_Elev_.cmd"
REM Save current directory.
FOR /F "delims=" %%d IN ('CD') DO (
ECHO SET "_ELEV_DIR_=%%~d" > "%_ELEV_ENV_%"
)
CALL :SaveCommand %*
:: Create a temporary script.
ECHO Set UAC=CreateObject^("Shell.Application"^) > "%_ELEV_VBS_%"
:: ShellExecute
:: @param[in] sFile
:: @param[in] vArguments
:: @param[in] vDirectory
:: @param[in] vOperation "runas": run as administrator.
:: @param[in] vShow 1: run in a normal window.
ECHO UAC.ShellExecute "%~nx0", "_ELEV_", "%_ELEV_DIR_%", "runas", 1 >> "%_ELEV_VBS_%"
:: Invoke the script.
"%_ELEV_VBS_%"
CALL :Clean
EXIT /B
:: ========= Elevate Access Right End =========
:: ========= SaveCommand Begin =========
:SaveCommand
SHIFT /0
REM Save command line arguments (double quotes are preserved:).
IF "%~0"=="" (
REM If this script is run without arguments, start a console by default.
ECHO SET _ELEV_CMD_=cmd >> "%_ELEV_ENV_%"
) ELSE (
CALL :IsBatch %0
IF ERRORLEVEL 1 (
REM `CALL` is required to invoke a batch file.
ECHO SET _ELEV_CMD_=CALL %* >> "%_ELEV_ENV_%"
) ELSE (
ECHO SET _ELEV_CMD_=%* >> "%_ELEV_ENV_%"
)
)
EXIT /B
:: ========= SaveCommand End =========
:: ========= RunAsAdmin Begin =========
:RunAsAdmin
IF "%~1"=="_ELEV_" (
CALL :Delegate
) ELSE (
%*
)
EXIT /B
:: ========= RunAsAdmin End =========
:: ========= IsBatch Begin =========
:IsBatch
IF "%~x1"==".cmd" ( EXIT /B 1 )
IF "%~x1"==".bat" ( EXIT /B 1 )
EXIT /B 0
:: ========= IsBatch End =========
:: ========= Do work Begin =========
:Delegate
SET "_ELEV_VBS_=%TEMP%\_Elev_.vbs"
SET "_ELEV_ENV_=%TEMP%\_Elev_.cmd"
REM Restore environment variables.
CALL "%_ELEV_ENV_%"
REM Restore current directory.
CD /D "%_ELEV_DIR_%"
REM Delete temporary files.
DEL /Q "%_ELEV_ENV_%"
DEL /Q "%_ELEV_VBS_%"
REM Invoke command.
CALL %_ELEV_CMD_%
CALL :Clean
EXIT /B
:: ========= Do work End =========
:: ========= Clean Start =========
:Clean
REM Clear environment variables.
SET "_ELEV_VBS_="
SET "_ELEV_ENV_="
SET "_ELEV_DIR_="
SET "_ELEV_CMD_="
EXIT /B
:: ========= Clean End =========