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-Key: 1464482504

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

Printed on: May 9, 2024 at 18:05 o'clock

Mitglied: 149569
149569 Nov 04, 2021 updated at 09:53:05 (UTC)
Goto Top
Member: istike2
Solution istike2 Nov 07, 2021 at 10:34:14 (UTC)
Goto Top
Vielen Dank Hacktor face-smile
Member: istike2
istike2 Nov 07, 2021 updated at 12:57:10 (UTC)
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.
Member: istike2
Solution istike2 Nov 07, 2021 at 13:17:28 (UTC)
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
)
Mitglied: 149569
149569 Nov 07, 2021 updated at 14:17:15 (UTC)
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.