Lo script Cmd non funziona correttamente
Sep 12 2020
Ho creato uno script che aggiunge la modalità di compatibilità tramite cmd, ma ho problemi a farlo funzionare:
Reg Add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%CD%\mha2.exe" /t REG_SZ /d "WINXPSP3 256COLOR 640X480" /f
:: # For testing only:
MkDir Success
Exit
- Quando si esegue lo script tramite la GUI, la directory
Successviene creata, ma la modalità di compatibilità non è impostata; non importa se eseguo lo script con / senza privilegi di amministratore - Quando si esegue lo script con i privilegi di amministratore tramite quanto segue, fa tutto ciò che dovrebbe:
Start "C:\Path\To\script.bat"
Perché è così e come lo risolvo?
Risposte
1 AlphaInc. Sep 12 2020 at 15:41
Dopo alcune ore di lavoro, ho capito: i privilegi di amministratore sono necessari per avviare lo script quando si include un one-liner prima Reg Add, come cmdlo avvierà in %WinDir%\system32.
- Nel caso qualcuno voglia fare la stessa cosa:
@echo off :: # BatchGotAdmin :------------------------------------- REM # --> Check for permissions if "%PROCESSOR_ARCHITECTURE%" EQU "amd64" ( >nul 2>&1 "%SystemRoot%\SysWOW64\cacls.exe" "%SystemRoot%\SysWOW64\config\system" ) else ( >nul 2>&1 "%SystemRoot%\system32\cacls.exe" "%SystemRoot%\system32\config\system" ) REM # --> If error flag set, we do not have admin. if '%errorlevel%' NEQ '0' ( Echo "Requesting administrative privileges..." GoTo UACPrompt ) else ( GoTo GotAdmin ) :UACPrompt Echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" Set params= %* Echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" Del "%temp%\getadmin.vbs" Exit /b :GotAdmin Pushd "%CD%" Cd /d "%~dp0" :-------------------------------------- Reg Add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "%CD%\mha2.exe" /t REG_SZ /d "WIN98 256COLOR 640X480" /f
ItWasn'tMe Sep 17 2020 at 10:16
@echo off && Setlocal EnableDelayedExpansion
2>nul "%__APPDIR__%whoami.exe" /groups | find "S-1-16-12288" >nul && goto=:gotAdmin
echo\Requesting administrative privileges... && set "_args=%*" && set "_flag=1" && >"%temp%\getadmin.vbs" ^
echo=CreateObject("Shell.Application"^).ShellExecute "%~sdpnx0", "!_args:"=""!", "RunAsAdministrator", "runas", 1 :WScript.Quit
%__AppDir__%cscript.exe "%temp%\getadmin.vbs"|find/v "." & echo\<nul & cd. & 2>nul del /q /f "%temp%\getadmin.vbs" && goto=:EOF
:gotAdmin
cd /d "%~dp0" && set "_Reg_Key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
%__AppDir__%reg.exe add "!_Reg_Key!" /v \""!CD!\Launcher.exe\"" /t REG_SZ /d "WIN98 256COLOR 640X480" /f
2>&1 %__AppDir__%reg.exe Query "!_Reg_Key!"|%__AppDir__%findstr.exe /i Launcher.exe.*WIN98.256COLOR.640X480 && ^
echo\Requesting admin works || echo\Not works, sorry... & %__AppDir__%timeout.exe /t -1 && endlocal && goto=:EOF
Che ne dici di un altro comando per semplificare la verifica dei privilegi di amministratore:
ExecuteCMD && return 0 and I'm the admin and goto label :gotAdmin
The last command was unsuccessful because I'm not the admin and now I'll create and call vbs file...
Whoami.exe | find "S-1-16-12288" && goto=:gotAdmin
The last command was unsuccessful because I'm not the admin and now I'll create and call vbs file...