istike2
Goto Top

Variablen in Python-GUI abfragen und Powershell übergeben möglich

Hallo,

ich würde gerne einen Powershell Script in einer Python-GUI "einbetten" und aus dem GUI-Variable-Werte übernehmen:

Ich habe als Ausbildungsaufgabe den folgenden Powershell-Script zusammengebastellt:

##Formatierung der Dateiname##
$MyTime=Get-Date
#in sortierbaren String umwandeln Microsekundengenau
$TimeStamp=$MyTime.tostring("yyyymmddHHmmssffff")  

##ich lese hier die Seriennummer aus##

$sn = (gwmi win32_bios).SerialNumber

##Name des angemeldeten User##
$username = $(Get-WMIObject -class Win32_ComputerSystem | select UserName).username
$profil = $env:USERPROFILE

##ich lege hier den Pfad der TXT-Datei fest##
$infodatei = $profil+"\Desktop\"+$TimeStamp+"_"+$sn+".txt"  
$pcinfodatei = $profil+"\Desktop\"+$TimeStamp+"_"+$sn+".csv"  

##ich lese hier die Rechnerinfos aus##
$winver = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\" -Name ReleaseID).ReleaseId  
$OsName = Get-ComputerInfo OsName
$OsVersion = Get-ComputerInfo OsVersion
$OsBuildNumber = Get-ComputerInfo OsBuildNumber
$OsHardwareAbstractionLayer = Get-ComputerInfo OsHardwareAbstractionLayer
$OfficeVer = reg query "HKEY_CLASSES_ROOT\Word.Application\CurVer"  

Get-ComputerInfo | select-object OSname,
OsVersion,
WindowsInstallDateFromRegistry, 
WindowsProductId,
BiosBIOSVersion,
BiosFirmwareType,
BiosManufacturer,
BiosReleaseDate,
BiosSeralNumber,
CsCaption,
CsManufacturer,
CsModel,
CsNumberOfLogicalProcessors,
CsSystemFamily | Export-Csv -ErrorAction Stop -path $pcinfodatei -noTypeInformation -Delimiter ";" -Force  

##ich lese hier den Bitlocker Recovery-Key aus##
$BitlockerVolumers = Get-BitLockerVolume
$BitlockerVolumers |
ForEach-Object {
$MountPoint = $_.MountPoint
$RecoveryKey = [string]($_.KeyProtector).RecoveryPassword
if ($RecoveryKey.Length -gt 5) 
{

Write-Output ("Seriennummer: $sn") | Out-File $infodatei  
Add-Content $infodatei "Recovery-Key:$recoverykey"  
Add-Content $infodatei "User:$username"  
Add-Content $infodatei "Benutzerprofil:$profil"  
Add-Content $infodatei "Windows-Version:$winver"  
Add-Content $infodatei "$OsName"  
Add-Content $infodatei "$OsVersion"  
Add-Content $infodatei "$OsBuildNumber"  
Add-Content $infodatei "$OsHardwareAbstractionLayer"  
Add-Content $infodatei "$OfficeVer"  

## ich möchte hier die TXT per Mail versenden ##
Function sendmail($FROM,$TO,$SUBJECT,$BODY,[System.IO.FileInfo[]]$ATTACHMENTS = $null){
  $SMTPHOST = "XXXXXXXXX.kasserver.com"  
  $SMTPPORT = 587
  $SMTPUSER = "report@XXXXXX.de"  
  $SMTPPass = "XXXXXXXXXXXXXXXX"  
  $SMTPClient = New-object System.Net.Mail.SmtpClient($SMTPHOST,$SMTPPORT)
  $SMTPClient.EnableSsl = $true
  $Mail = new-object System.Net.Mail.MailMessage
  $Mail.from = $FROM 
  $Mail.to.add($TO)
  $SMTPClient.Credentials = new-object System.Net.NetworkCredential($SMTPUSER,$SMTPPass)
  $Mail.Subject = $SUBJECT
  $Mail.Body = $BODY
  # Add Attachments
  if ($ATTACHMENTS){
      foreach ($att in $ATTACHMENTS){
        $Mail.Attachments.Add($att.FullName)
      }
  }
  $SMTPClient.Send($Mail)
  $smtpclient.Dispose()
  $mail.Dispose()
}

sendmail "ABSENDERADRESSE" "ZIELADRESSE" "DEIN BETREFF" "REPORT" (gci $infodatei)}  
}

Ich würde gerne die Angaben und Variablen wie z. B.

Script: "C:\\Users\\USER\\Desktop\\testscript.ps1" --> Python
  • $infodatei = $profil+"\Desktop\"+$TimeStamp+"_"+$sn+".txt" --> Powershell
$pcinfodatei = $profil+"\Desktop\"+$TimeStamp+"_"+$sn+".csv" --> Powershell
ABSENDERADRESSE" --> Powershell
"ZIELADRESSE" --> Powershell
"DEIN BETREFF" --> Powershell
"REPORT"--> Powershell
$SMTPHOST --> Powershell
$SMTPPORT --> Powershell
$SMTPUSER --> Powershell
$SMTPPass --> Powershell

in einem PYQT5 Dialog abfragen und als Variablewert dem Powershell-Script übergeben.
Am Ende sollte es als exe oder msi ausführbar sein. Der PW-Script wird aktuell auch als EXE ausgeführt und funktioniert soweit.

Ich würde den PS-Prozess sonst so "rufen" ...

# -*- coding: iso-8859-1 -*-
import subprocess, sys

p = subprocess.Popen(["powershell.exe",   
              "C:\\Users\\USER\\Desktop\\testscript.ps1"],   
              stdout=sys.stdout)
p.communicate()



Ist diese Übergabe von Eingaben von PYQT5 an Powershell möglich (oder sinnvoll)?

Vielen Dank für eure Meinungen.

Gr. I.

Content-ID: 1464482504

Url: https://administrator.de/forum/variablen-in-python-gui-abfragen-und-powershell-uebergeben-moeglich-1464482504.html

Ausgedruckt am: 13.03.2025 um 16:03 Uhr

149569
149569 04.11.2021 aktualisiert um 10:53:05 Uhr
Goto Top
istike2
Lösung istike2 07.11.2021 um 11:34:14 Uhr
Goto Top
Vielen Dank Hacktor face-smile
istike2
istike2 07.11.2021 aktualisiert um 13:57:10 Uhr
Goto Top
Hi,

ich habe mal die wichtigsten Parameter abfragen und der Funktion übergeben wollen:

Param(
    [Parameter(Mandatory=$False)]
    [string]$SMTPHOST,

    [Parameter(Mandatory=$False)]
    [string]$SMTPPORT,

    [Parameter(Mandatory=$False)]
    [string]$SMTPUSER,

    [Parameter(Mandatory=$False)]
    [string]$SMTPPass,

    [Parameter(Mandatory=$False)]
    [string]$FROM,

    [Parameter(Mandatory=$False)]
    [string]$TO
)


## ich möchte hier die TXT per Mail versenden ##
Function sendmail($FROM,$TO,$SUBJECT,$BODY,[System.IO.FileInfo[]]$ATTACHMENTS = $null){
  
  $SMTPClient = New-object System.Net.Mail.SmtpClient($SMTPHOST,$SMTPPORT)
  $SMTPClient.EnableSsl = $true
  $Mail = new-object System.Net.Mail.MailMessage
  $Mail.from = $FROM 
  $Mail.to.add($TO)
  $SMTPClient.Credentials = new-object System.Net.NetworkCredential($SMTPUSER,$SMTPPass)
  $Mail.Subject = $SUBJECT
  $Mail.Body = $BODY
  # Add Attachments
  if ($ATTACHMENTS){
      foreach ($att in $ATTACHMENTS){
        $Mail.Attachments.Add($att.FullName)
      }
  }
  $SMTPClient.Send($Mail)
  $smtpclient.Dispose()
  $mail.Dispose()
}

sendmail $FROM $TO "Ergebnis $sn $fullname" "REPORT" (Get-ChildItem $infodatei,$pcinfodatei,$updatestatus )}  
}

Blöder Weise klappt es irgendwie nicht, ich hatte gar nicht die Möglichkeit irgendetwas einzugeben ...

variable

Es klappte weder innerhalb, noch außerhalb der Function "Sendmail".

Auch in dieser einfacheren Form nicht:

Param(
    [string]$SMTPHOST,
    [string]$SMTPPORT,
    [string]$SMTPUSER,
    [string]$SMTPPass,
    [string]$FROM,
    [string]$TO
)

Gr. I.
istike2
Lösung istike2 07.11.2021 um 14:17:28 Uhr
Goto Top
Am Ende klappte es mit Mandatory = $true

Param(
    [Parameter(Mandatory = $true, HelpMessage="Geben Sie Ihren Servername ein")]  
    [ValidateNotNullorEmpty()]
    [string] $SMTPHOST,

    [Parameter(Mandatory = $true, HelpMessage="Geben Sie den Port ein")]  
    [ValidateNotNullorEmpty()]
    [string] $SMTPPORT,

    [Parameter(Mandatory = $true, HelpMessage="Geben Sie Ihren Username ein")]  
    [ValidateNotNullorEmpty()]
    [string] $SMTPUSER,

    [Parameter(Mandatory = $true, HelpMessage="Geben Sie Ihr Passwort ein")]  
    [ValidateNotNullorEmpty()]
    [string] $SMTPPass,

    [Parameter(Mandatory = $true, HelpMessage="Geben Sie Ihre Absenderadresse ein")]  
    [ValidateNotNullorEmpty()]
    [string] $FROM,

    [Parameter(Mandatory = $true, HelpMessage="Geben Sie Ihre Zieladresse ein")]  
    [ValidateNotNullorEmpty()]
    [string] $TO
)
149569
149569 07.11.2021 aktualisiert um 15:17:15 Uhr
Goto Top
Schon witzig wie hier einige hier die Platform im Dauerabo zum selbst nachdenken missbrauchen 🙃😆
Wäre vielleicht mal sinniger weniger planlos durch die Welt zu schaukeln, und statt Trial & Error als erstes immer die Doku aufzuschlagen und vor dem Thread-Schreiben erst in sich zu gehen und zu Lesen ...
Powershell - Leitfaden für Anfänger

Btw. der SMTP Client ist schon länger deprecated und wird nicht mehr weiterentwickelt, sollte man besser gleich durch Mailkit ersetzen, denn STARTTLS ist das einzige was der supported und das glänzt ja mittlerweile durch x Sicherheitsprobleme, also nur eine Frage der Zeit bis einem das auf die Füße fällt.