管理者権限の判定、権限昇格を PowerShell を呼び出して行う
Admin.PowerShell_PS.cmd
@echo off && goto PreCheck
<# -----------------コマンドプロンプト-----------------
:PreCheck
PowerShell -NoExit -Command "" ^
$File = "'%~f0'"; ^
$CD = ${Env:__CD__}.TrimEnd('\'); ^
function IsNotProcessElevated { ^
$Name = """WindowsIdentity""", """WindowsPrincipal""", """WindowsBuiltInRole"""; ^
$Type = """System.Management.Automation.TypeAccelerators"""; ^
$Pref = """System.Security.Principal."""; ^
$Name ^| %%{[PSObject].Assembly.GetType($Type)::Add($_,[Type]::GetType($Pref+$_))}; ^
$Bool = !([WindowsPrincipal][WindowsIdentity]::GetCurrent()).IsInRole([WindowsBuiltInRole]"""Administrator"""); ^
$Name ^| %%{[void][PSObject].Assembly.GetType($Type)::Remove($_)}; ^
If ($Bool){return $true}; $false; ^
}; ^
if (IsNotProcessElevated) { ^
Write-Host "'%~nx0'": elevating self; ^
$Exe = """PowerShell"""; ^
$Opt = """-NoProfile -ExecutionPolicy Bypass -Command """ + ^
"""Set-Location -Path '"`""$CD"`""';""" + ^
""". '"`""$File"`""' """; ^
$Dir = $Env:__APPDIR__; ^
$Shell = New-Object -ComObject """Shell.Application"""; ^
pause; ^
$Shell::ShellExecute($Exe, $Opt, $Dir, """RunAs""", 1); ^
}; ^
if (IsNotProcessElevated) {EXIT 1}; EXIT 0 ^
""
if errorlevel 1 (EXIT)
:Excute
set "dir=%~dp0"
PowerShell -NoP -Ex Unrestricted "$S=[ScriptBlock]::Create((gc '%~f0'|?{$_.ReadCount -gt 1})-join\"`n\");&$S" "'%dir%'" &exit /b
--------------------------END------------------------- #>
Param([string] $PSScriptRoot)
###################################
#### Powershell Script Start ####
#### Script FINISH ####
###################################
Write-Host "---Script Finish---"
PAUSE
EXIT
CMD を使って管理者権限の有無を判定し、VBS を利用して権限昇格
Admin.PowerShell_VBS.cmd
@echo off && goto PreCheck
<# -----------------コマンドプロンプト-----------------
:PreCheck
setlocal
for /f "tokens=3 delims=\ " %%A in ('whoami /groups^|find "Mandatory Label"') do set LEVEL=%%A
if not "%LEVEL%"=="High" goto GETadmin
goto Excute
:GETadmin
endlocal
echo "%~nx0": elevating self
del "%temp%\getadmin.vbs" 2>NUL
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo Dim stCmd >> "%vbs%"
echo stCmd = "/c """"%~s0"" " ^& """%~dp0""" ^& Chr(34) >> "%vbs%"
echo UAC.ShellExecute "cmd.exe", stCmd, "", "runas", 1 >> "%vbs%"
pause
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:Excute
endlocal
set "dir=%~1"
PowerShell -NoP -Ex Unrestricted "$S=[ScriptBlock]::Create((gc '%~f0'|?{$_.ReadCount -gt 1})-join\"`n\");&$S" "'%dir%'" &exit /b
--------------------------END------------------------- #>
Param([string] $PSScriptRoot)
###################################
#### Powershell Script Start ####
#### Script FINISH ####
###################################
Write-Host "---Script Finish---"
PAUSE
EXIT