tinnitus97
Goto Top

Probleme mit der Neuprogrammierung von Skript (Batch Non GUI zu Powershell GUI)

Hallo,
ich bin grade dabei unserer Einrichtungsskript zu modernisieren. (Es soll eine GUI bekommen)
leider habe ich bei der Umstellung ein paar Probleme und bin für jede Hilfe Dankbar.

- Bei der alten Version habe ich mit Sprungpunkte gearbeitet (Wie wird das bei Powershell gemacht ?)
- Ich wollte alle Echos in einer Outbox ausgeben (Wie mache ich das am besten ?)
- Ich aktiviere in asw6 den Lokalen Admin und muss ein PW einlesen. (Habe ja jetzt eine GUI ?! Wie lese ich das PW jetzt ein ? Kann Mann das über die Outbox einlesen ??)
- In asw6 werde viele Aktionen durchgeführt diese müssen nacheinander durchgeführt werden (Installationen muss abgewartet werden) Gibt es dafür ein Befehl ???
- In asw6 werde viele Aktionen durchgeführt muss ich diese Befehle einfach mit ein + Verbinden oder wie Funktioniert das ??


Ich habe Mal das Alte Skript und das Neue (ist noch nicht feritg) angehängt.

ALTES Skript

@echo off
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"  
    echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"  

    "%temp%\getadmin.vbs"  
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )  
    pushd "%CD%"  
    CD /D "%~dp0"  

@echo off
cd /d "%~dp0"  
ECHO Automatische einrichtung 
ECHO Version 2.50 von 26.12.2019
echo.
echo   [1]  KIS installieren und Secure Con. entfernen 
echo   [2]  Firefox installieren
echo   [3]  HP Support Assistant installieren
echo   [4]  VPN Client installieren
echo   [5]  Grundinstallation 
echo   [6]  Lokalen Administrator aktivieren
echo.
echo Die Eingaben muessen durch ein Komma getrennt werden !!!

set /p "$asw= Gebe deine Auswahl ein (1,2,3,4,5,6,7): "  
for  %%a in (%$asw%) do call:asw%%a
exit/b

:asw1
echo Installiert wird KIS 
start /wait Kaspersky200141085.exe /s
echo Kaspersky Secure Connection wird entfernt 
"C:\Program Files (x86)\Kaspersky Lab\Kaspersky Secure Connection 4.0\StartMenu\ksde\Kaspersky Secure Connection\Kaspersky Secure Connection entfernen.lnk" /passive  
exit/b

:asw2
echo Firefox wird installiert 
Start /wait Firefox.exe /s
exit/b

:asw3
echo HP Support Assistant wird instaliert
Start /wait HPSupportAssistant.exe /s
echo HP Support Assistant wird instaliert. Dies dauert eine weile und muss abgewartet werden. 
timeout /T 60 /nobreak
exit/b

:asw4
echo VPN Client wird installiert 
start /wait AdvancedVPNClient5.exe
exit/b

:asw5
echo Adobe wird installiert
start /wait Reader.exe /sAll
echo Ein Adobe Patch wird installiert
start /wait Msiexec /p ReaderUpdate.msp /qn
echo Java wird installiert
start /wait Java.exe /s
echo 7zip wird installiert 
msiexec /i 7zip19.msi /qn
echo VLC Media Player wird installiert 
start /wait VLCMediaPlayer.exe /L=1031 /S
echo Microsoft Edge wird installiert 
start /wait MicrosoftEdgeSetup.exe
xcopy "Fernwartung.exe" "c:\Users\Public\Desktop"  
desk.cpl ,,5
manage-bde -status                          
timeout /T 20 /nobreak               
manage-bde -off c:
manage-bde -off d:
echo Standard Einstellungen werden vorgenommen !
powercfg -setactive 381b4222-f694-41f0-9685-ff5bb260df2e
powercfg -changename 381b4222-f694-41f0-9685-ff5bb260df2e "COMPULAN"  
powercfg /X /monitor-timeout-ac 30
powercfg /X /monitor-timeout-dc 30
powercfg /X /standby-timeout-ac 0
powercfg /X /standby-timeout-dc 0
powercfg /X /disk-timeout-ac 0
powercfg /X /disk-timeout-dc 0
echo NetFramework 3 wird Aktiviert 
powershell -Executionpolicy ByPass -Noprofile -Command "Enable-WindowsOptionalFeature -Online -FeatureName NetFx3 -All"   
echo RegBack wird aktiviert 
REG ADD "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Configuration Manager" /V "EnablePeriodicBackup" /T REG_DWORD /D "00000001"  
start /wait Intel.exe /s
%windir%\system32\cmd.exe /c "start microsoft-edge:https://www.intel.de/content/www/de/de/support/intel-driver-support-assistant.html"  
exit/b

:asw6
echo Der Lokale Admin wird aktiviert 
net user administrator /active:yes
net user administrator *
sysdm.cpl
start Autologon.exe
exit/b


Neue Skript

[System.reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
$shell = New-Object -ComObject “Shell.Application”
$shell.Minimizeall()
[System.reflection.assembly]::loadwithpartialname("System.Drawing")   


If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))  
{
    Write-Host "Running elevated..."  
    $arguments = "& '" + $myinvocation.mycommand.definition + "'"  
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    Break
}

function GenerateForm {

$form1 = New-Object System.Windows.Forms.Form
$button1 = New-Object System.Windows.Forms.Button
$checkBox6 = New-Object System.Windows.Forms.CheckBox
$checkBox5 = New-Object System.Windows.Forms.CheckBox
$checkBox4 = New-Object System.Windows.Forms.CheckBox
$checkBox3 = New-Object System.Windows.Forms.CheckBox
$checkBox2 = New-Object System.Windows.Forms.CheckBox
$checkBox1 = New-Object System.Windows.Forms.CheckBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
$outputBox = New-Object System.Windows.Forms.TextBox

$b1= $false
$b2= $false
$b3= $false
$b4= $false
$b5= $false
$b6= $false

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------

$handler_button1_Click= 
{   

    if ($checkBox1.Checked)     {}

    if ($checkBox2.Checked)     {  Start-Process "C:\Users\Tino Quitsch PC\Desktop\Firefox.exe" /S -NoNewWindow -Wait -PassThru            }  

    if ($checkBox3.Checked)     {  Start-Process "C:\Users\Tino Quitsch PC\Desktop\HPSupportAssistant.exe" /S -NoNewWindow -Wait -PassThru }  

    if ($checkBox4.Checked)     {  Start-Process "C:\Users\Tino Quitsch PC\Desktop\AdvancedVPNClient5.exe" /S -NoNewWindow -Wait -PassThru }  
    
    if ($checkBox5.Checked)     {$MyMultiLineTextBox.AppendText("`nRunning Fix...")}  
    
    if ($checkBox6.Checked)     {  net user administrator /active:yes                                                                      }
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
    $form1.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$form1.Text = "install V3"  
$form1.Name = "form1"  
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 500
$System_Drawing_Size.Height = 300
$form1.ClientSize = $System_Drawing_Size


$outputBox.Location = New-Object System.Drawing.Size
$outputBox.Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 290
$System_Drawing_Size.Height = 200
$outputBox.Size = $System_Drawing_Size
$outputBox.MultiLine = $True
$outputBox.ScrollBars = "Vertical"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 200
$System_Drawing_Point.Y = 15
$outputBox.Location = $System_Drawing_Point
$outputBox.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.Controls.Add($outputBox)


$button1.TabIndex = 7
$button1.Name = "button1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 75
$System_Drawing_Size.Height = 23
$button1.Size = $System_Drawing_Size
$button1.UseVisualStyleBackColor = $True
$button1.Text = "Run Script"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 27
$System_Drawing_Point.Y = 205
$button1.Location = $System_Drawing_Point
$button1.DataBindings.DefaultDataSourceUpdateMode = 0
$button1.add_Click($handler_button1_Click)

$form1.Controls.Add($button1)

$checkBox6.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 200
$System_Drawing_Size.Height = 24
$checkBox6.Size = $System_Drawing_Size
$checkBox6.TabIndex = 5
$checkBox6.Text = "Administrator aktivieren"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 10
$System_Drawing_Point.Y = 165
$checkBox6.Location = $System_Drawing_Point
$checkBox6.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox6.Name = "checkBox6"  

$form1.Controls.Add($checkBox6)

$checkBox5.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 200
$System_Drawing_Size.Height = 24
$checkBox5.Size = $System_Drawing_Size
$checkBox5.TabIndex = 4
$checkBox5.Text = "Grundinstallation"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 10
$System_Drawing_Point.Y = 135
$checkBox5.Location = $System_Drawing_Point
$checkBox5.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox5.Name = "checkBox5"  

$form1.Controls.Add($checkBox5)

$checkBox4.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 200
$System_Drawing_Size.Height = 24
$checkBox4.Size = $System_Drawing_Size
$checkBox4.TabIndex = 3
$checkBox4.Text = "VPN Client installieren"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 10
$System_Drawing_Point.Y = 105
$checkBox4.Location = $System_Drawing_Point
$checkBox4.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox4.Name = "checkBox4"  

$form1.Controls.Add($checkBox4)

$checkBox3.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 200
$System_Drawing_Size.Height = 24
$checkBox3.Size = $System_Drawing_Size
$checkBox3.TabIndex = 2
$checkBox3.Text = "Support Assistant installieren"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 10
$System_Drawing_Point.Y = 75
$checkBox3.Location = $System_Drawing_Point
$checkBox3.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox3.Name = "checkBox3"  

$form1.Controls.Add($checkBox3)


$checkBox2.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 200
$System_Drawing_Size.Height = 24
$checkBox2.Size = $System_Drawing_Size
$checkBox2.TabIndex = 1
$checkBox2.Text = "Firefox installieren"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 10
$System_Drawing_Point.Y = 44
$checkBox2.Location = $System_Drawing_Point
$checkBox2.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox2.Name = "checkBox2"  

$form1.Controls.Add($checkBox2)


$checkBox1.UseVisualStyleBackColor = $True
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 200
$System_Drawing_Size.Height = 24
$checkBox1.Size = $System_Drawing_Size
$checkBox1.TabIndex = 0
$checkBox1.Text = "KIS installieren"  
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 10
$System_Drawing_Point.Y = 13
$checkBox1.Location = $System_Drawing_Point
$checkBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$checkBox1.Name = "CheckBox 1"  

$form1.Controls.Add($checkBox1)


#Save the initial state of the form
$InitialFormWindowState = $form1.WindowState
#Init the OnLoad event to correct the initial state of the form
$form1.add_Load($OnLoadForm_StateCorrection)
#Show the Form
$form1.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm

Content-Key: 531429

Url: https://administrator.de/contentid/531429

Printed on: April 26, 2024 at 15:04 o'clock

Member: TK1987
TK1987 Jan 06, 2020, updated at Jan 07, 2020 at 02:22:54 (UTC)
Goto Top
Zitat von @Tinnitus97:
- Bei der alten Version habe ich mit Sprungpunkte gearbeitet (Wie wird das bei Powershell gemacht ?)

Dafür gibt es Funktionen.

Auch für die einzelnen GUI-Elemente würde ich Funktionen anlegen. Modualisierung heisst das Zauberwort.

Z. B. für die Checkboxen:
Function Checkbox {
	Param(
		[Alias('t')][string]$Text,  
		[Alias('b')][int]$Breite=200,  
		[Alias('h')][int]$Höhe=24,  
		[Alias('i')][int]$Index,  
		[int]$X=10,
		[int]$Y
		)
	
	$CheckBox=New-Object System.Windows.Forms.Checkbox
	$CheckBox.UseVisualStyleBackColor=$True
	$CheckBox.Text=$Text
	$CheckBox.TabIndex=$Index
	$CheckBox.Size=New-Object System.Drawing.Size($Breite,$Höhe)
	$CheckBox.Location=New-Object System.Drawing.Size($X,$Y)
	$CheckBox.DataBindings.DefaultDataSourceUpdateMode = 0
	
	Return $CheckBox
	}

Der Vorteil ist, dass du anschließend jede Checkbox mit nur einer einzigen Codezeile definieren kannst
$CheckBox1=Checkbox -t 'KIS installieren' -i 0 -y 13  
$CheckBox2=CheckBox -t 'Firefox installieren' -i 1 -y 44  
...
In den Paramtern der Funktion habe ich bereits Standardwerte für die Breite, Höhe und X-Koordinate zugewiesen. Du kannst diese Schalter beim Aufrufen der Funktion angeben, dann nimmt er den Wert den du übergibst. Lässt du diese Schalter hingegen weg, so nimmt er den Standardwert.

Der Form würde ich darüber hinaus nur eine Minimalgröße geben und sie dann auf AutoSize stellen. So musst du nicht jedes mal die Größe der Form ändern, wenn du Objekte hinzufügst oder entfernst.
Anschließend einen Paddingwert angeben, damit das Fenster eine Randbreite hat.
Function Form {
	Param(
		[Alias('t')][string]$Text,  
		[Alias('p')][int]$Padding  
		)
		
	$Form=New-Object System.Windows.Forms.Form
	$Form.Size=New-Object System.Drawing.Size(100,100)
	$Form.StartPosition='CenterScreen'  
	$Form.Text=$Text
	$Form.AutoSize=$true
	$Form.Padding=New-Object System.Windows.Forms.Padding($Padding)
	
	Return $Form
	}

- Ich wollte alle Echos in einer Outbox ausgeben (Wie mache ich das am besten ?)
Eine TextBox zur Form hinzufügen, in dieser fügst du dann den Output ein.
- Ich aktiviere in asw6 den Lokalen Admin und muss ein PW einlesen. (Habe ja jetzt eine GUI ?! Wie lese ich das PW jetzt ein ? Kann Mann das über die Outbox einlesen ??)

In dem Stil weiter ein neues Fenster erstellen. Ich würde hier darüber hinaus noch die Option hinzufügen, gänzlich neue Benutzer anlegen zu können - da dies keinen Mehraufwand darstellt.

Function Feld {
	Param(
		[Alias('t')][string]$Text,  
		[Alias('te')][string]$TextEingabe,  
		[Alias('bl')][int]$BreiteLabel=100,  
		[Alias('be')][int]$BreiteEingabe=200,  
		[Alias('h')][int]$Höhe=24,  
		[Alias('i')][int]$TabIndex=9,  
		[Alias('p')][switch]$Password,  
		[int]$X=10,
		[int]$Y
		)
	
	$Feld=New-Object psobject -Property @{
		Label=New-Object System.Windows.Forms.Label
		Textbox=New-Object System.Windows.Forms.TextBox
		}

	$Feld.Label.Text=$Text
	$Feld.Label.TextAlign='MiddleLeft'  
	$Feld.Label.Size=New-Object System.Drawing.Size($BreiteLabel,$Höhe)
	$Feld.Label.Location=New-Object System.Drawing.Size($X,$Y)

	$Feld.Textbox.Size=New-Object System.Drawing.Size($BreiteEingabe,$Höhe)
	$Feld.Textbox.Text=$TextEingabe
	$Feld.Textbox.Tabindex=$TabIndex
	$Feld.Textbox.Location=New-Object System.Drawing.Size(($X+$BreiteLabel),$Y)
	if ($Password){$Feld.Textbox.PasswordChar='*'}  
	
	Return $Feld
	
	}

Function Button {
	Param(
		[Alias('t')][string]$Text,  
		[Alias('b')][int]$Breite=100,  
		[Alias('h')][int]$Höhe=40,  
		[Alias('i')][int]$TabIndex,  
		[int]$X=10,
		[int]$Y
		)
	
	$Button=New-Object System.Windows.Forms.Button
	$Button.TabIndex=$TabIndex
	$Button.Text=$Text
	$Button.Size=New-Object System.Drawing.Size($Breite,$Höhe)
	$Button.Location=New-Object System.Drawing.Size($X,$Y)

	Return $Button
	}

$UserForm=Form -t 'Benutzer anlegen / aktivieren' -p 10  
$Benutzer=Feld -t 'Benutzer:' -te 'Administrator' -y 24  
$Passwort=Feld -t 'Passwort:' -y 48 -i 0 -p  

$ButtonSpeichern=Button -t 'Speichern' -i 1 -x 50 -y 100  
$ButtonSpeichern.Add_Click({
	if (Get-LocalUser -Name $Benutzer.Textbox.Text 2>$NULL)
		{Set-LocalUser -Name $Benutzer.Textbox.Text -Password ($Passwort.Textbox.Text | ConvertTo-SecureString -AsPlainText -Force)}
		else {New-LocalUser -Name $Benutzer.Textbox.Text -Password ($Passwort.Textbox.Text | ConvertTo-SecureString -AsPlainText -Force)}
	Enable-LocalUser -Name $Benutzer.Textbox.Text
	$UserForm.Dispose()
	})

$ButtonAbbrechen=Button -t 'Abbrechen' -i 2 -x 160 -y 100  
$ButtonAbbrechen.Add_Click({
	$UserForm.Dispose()
	})

$UserForm.Controls.Add($Benutzer.Label)
$UserForm.Controls.Add($Benutzer.TextBox)
$UserForm.Controls.Add($Passwort.Label)
$UserForm.Controls.Add($Passwort.TextBox)
$UserForm.Controls.Add($ButtonSpeichern)
$UserForm.Controls.Add($ButtonAbbrechen)

[void]$UserForm.ShowDialog()

- In asw6 werde viele Aktionen durchgeführt diese müssen nacheinander durchgeführt werden (Installationen muss abgewartet werden) Gibt es dafür ein Befehl ???
Start-Process -wait ist schon richtig. Damit wird gewartet, bis die Installation vollständig abgeschlossen wurde.
- In asw6 werde viele Aktionen durchgeführt muss ich diese Befehle einfach mit ein + Verbinden oder wie Funktioniert das ??
Siehe oben. Funktion anlegen, jeder Befehl in einer Neuen Zeile und gut ist.

Mit + Verbindet man im Übrigen keine Befehle, das geht mit einem Semikolon (ist Quasi wie eine neue Zeile).
Member: Tinnitus97
Tinnitus97 Jan 06, 2020 at 19:48:18 (UTC)
Goto Top
Vielen Vielen Danke erstmal für die Umfangreiche Antwort.
Ich habe jetzt mal den Code mehr oder weniger zusammenkopiert.
Ich bekomme aber leider nur die Benutzer setzen Maske ?? ist das richtig ??
Member: TK1987
TK1987 Jan 07, 2020 at 00:09:22 (UTC)
Goto Top
Zitat von @Tinnitus97:
Ich bekomme aber leider nur die Benutzer setzen Maske ?? ist das richtig ??
Genau. Ich habe erstmal nur auf deine Unklarheiten geantwortet. Ich will dir ja nicht das Script schreiben, sondern den Weg dahin aufzeigen.

Bitte nicht einfach Blind zusammenkopieren, sondern versuchen zu verstehen, was ich da getan habe bzw. fragen, falls etwas daran unklar sein sollte.

Die GUI-Elemente so zu modualisieren bietet nämlich noch eine vielzahl weiterer Vorteile, aber ich dachte das reicht erstmal als Input... immer ein Schritt nach dem Anderen.