- Warum?

- Warum?

Ich habe die vorgeschlagene Lösung eingegebenProtokollieren einer gesamten Batchdateiausgabe.

Funktioniert aber nur, wenn unser Batch-Skript keinen Administratorzugriff anfordert oder Benutzereingaben entgegennimmt.

In meinem Skript nehme ich den Administratorzugriff und habe auch Benutzereingaben:

@echo off
:: BatchGotAdmin
::-------------------------------------
REM  --> Check for permissions
>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"
::--------------------------------------
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B
:LOG
REM Set IP address to USB Ethernet
echo "Set IP address to USB Ethernet :"
set /p SystemIP="Enter the System IP address[127.*.*.*]:" 
set /p  SystemSubnetMask="Enter the System Subnetmark[Default:255.255.255.0]:" 
IF [%system_subnetmask%]==[] set /p system_subnetmask=255.255.255.0
set /p SystemGateway="Enter the System Default Gateway[127.*.*.*]:" 
echo "Aviliable Ethernet Interface :"
netsh interface show interface
set /p EthernetInterfaceName="Type the Ethernet Interface Name:" 
netsh interface ip set address %EthernetInterfaceName% static %SystemIP% %SystemSubnetMask% %SystemGateway%
netsh interface ip set dns %EthernetInterfaceName% static 8.8.8.8
netsh interface ip add dnsserver %EthernetInterfaceName% address=4.2.2.2 index=1

Antwort1

„Wie protokolliere ich die Zugriffsberechtigung nach der Gewährung des Zugriffs im Batch-Skript?“

  • DerVerknüpfungbeantwortet dies in Ihrer Frage auf vielfältige Weise.

„Ich habe die vorgeschlagene Lösung in den unten stehenden Link eingegeben, aber sie funktioniert nur, wenn unser Batch-Skript keinen Administratorzugriff anfordert …

  • Einige Änderungen/Bearbeitungen in Ihrem Code sind notwendig, einschließlich solcher, die folgendes nutzen:, und die den Mechanismus der Anforderung von Administratorrechten beeinträchtigen."

„… oder beliebige Benutzereingaben entgegennehmen.“

  • Diese Aktionen in Ihrem Code, die Eingaben empfangen, erfolgen nach der Aktion zum Erhalten von Administratorrechten (durch VBS). Wenn also die vorherige Aktion nicht erfolgt, erfolgt auch diese nicht.

Ohne zu sehr ins Detail zu gehen: Ihr Ziel besteht darin, die Protokolle der Ausführungen Ihrer im Stapel aufgelisteten Befehle zu erhalten. Bei diesem Versuch lassen Sie jedoch die Ausgaben auf dem Bildschirm aus, weil Sie die Umleitung zu einer Protokolldatei verwenden, ohne jedoch zu erkennen, dass der Bildschirm (stdout) keine Befehlsausgaben aufweist, sondern sogar lahmgelegt wird und auf set /pBefehlseingaben wartet.

Dadurch wird Ihr laufender Code nicht unbedingt unterbrochen, aber er „hängt“ definitiv, ohne dass eine Meldung auf dem Bildschirm angezeigt wird, und bleibt dort, während er auf die Fortsetzung der Benutzer-/Administratorinteraktion wartet, was jedoch nie geschieht.


Ich würde daher Änderungen vorschlagen, bei denen die für die Registrierung erforderlichen Aktionen von den Aktionen getrennt würden, die zum Empfang von Interaktion/Eingabe erforderlich sind:

@echo off

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" && goto :gotAdmin

echo/Requesting administrative privileges... & goto :UACPrompt
 
:UACPrompt 
set "_params=" & if not "%*" == "" =;(
     set "_params=%*" 
     call set "_params=%%_params:"=%%"
    );=
    
> "%temp%\getadmin.vbs" =;(
     echo/Set UAC = CreateObject("Shell.Application"^)
     echo/UAC.ShellExecute "%ComSpec%", "/c %~s0 %_params%", "", "runas", 1
    );= && "C:\Windows\System32\cscript.exe" //Nologo "%temp%\getadmin.vbs" 

>nul 2>&1 del /q "%temp%\getadmin.vbs" & exit /b || goto :eOf

:gotAdmin
cd /d "%~dp0"
set "_LogFile=%temp%\batch.log"

echo/Set IP address to USB Ethernet : 
set /p "_SystemIP=Enter the System IP address [127.*.*.*]: " 
set /p "_SystemSubnetMask=Enter the System Subnet Mask [Default: 255.255.255.0]: "

if "%_SystemSubnetMask%" == "" set "_System_SubnetMask=255.255.255.0"
set /p "_SystemGateway=Enter the System Default Gateway [127.*.*.*]: " 

echo/Aviliable Ethernet Interface:
"C:\Windows\System32\netsh.exe" interface show interface | findstr .

set /p "_EthernetInterfaceName=Type the Ethernet Interface Name: " 

:: logging commands after defined in/with admin inputs
:: ----------------------------------------------------
for %%i in (EthernetInterfaceName,SystemIP, SystemSubnetMask, SystemGateway
    )do "%ComSpec%" /v:on /e:on /c "echo/%%~i: !_%%~i!"

2>&1 =;(
      netsh interface show interface | findstr .
      for %%i in (EthernetInterfaceName,SystemIP, SystemSubnetMask, SystemGateway)do "%ComSpec%" /v:on /e:on /c "echo/%%~i: !_%%~i!"
      echo\ "C:\Windows\System32\netsh.exe" interface ip set address %_EthernetInterfaceName% static %_SystemIP% %_SystemSubnetMask% %_SystemGateway%
      echo\ "C:\Windows\System32\netsh.exe" interface ip set dns %_EthernetInterfaceName% static 8.8.8.8
      echo\ "C:\Windows\System32\netsh.exe" interface ip add dnsserver %_EthernetInterfaceName% address=4.2.2.2 index=1
      echo\ "C:\Windows\System32\ipconfig.exe" /flushdns
     );= >"%_LogFile%"

type "%_LogFile%" | clip 
"C:\Windows\System32\timeout.exe" -1

- Warum?

Obwohl es möglich ist, umzuleitenstderrZustdoutist es auch möglich, umzuleitenstderrUndstdoutgleichzeitig ist eine Umleitung nicht möglichstdin(set /P)Zustdoutin eine Datei und haben gleichzeitigstdoutauf dem Bildschirm empfangenstdinUnd Ihre Frage weist auf dieses Ziel hin.


Zeigerstream

Die globalen Konstantenzeiger stdin, stdout und stderr sind Standard-Streams für Eingabe, Ausgabe und Fehlerausgabe

stdin  Standard input     
stderr Standard error 
stdout Standard output

Redirection:
stderr  <to>  Null      <use>  2>Nul
stderr  <to>  stdout    <use>  2>&1 
stderr  <to>  File.Log  <use>  2>File.Log

stdout  <to>  Null      <use>  >Nul
stdout  <to>  Null      <use> 1>Nul
stdout  <to>  File.Log  <use>  >File.Log
stdout  <to>  File.Log  <use> 1>File.Log

Redirection stdout and stderr to File.Log:
2>&1  YourCommandHere   >File.Log
2>&1  YourCommandHere  1>File.Log

Set IP address to USB Ethernet : 
Enter the System IP address [127.*.*.*]:               //user input [stdin]
Enter the System Subnet Mask [Default: 255.255.255.0]: //user input [stdin]
Enter the System Default Gateway [127.*.*.*]:          //user input [stdin]
Avaliable Ethernet Interface:
Admin State.    State         Type            Interface Name
-------------------------------------------------------------------------
Enable          Conected      Dedicaed        Wi-Fi
    
Type the Ethernet Interface Name:                      //user input [stdin]

Zusätzliche Ressourcen:

verwandte Informationen