Wenn PC (WIN) auf Audio-Ausgabegerät x, dann schalte y

Begonnen von 87insane, 03 Oktober 2019, 14:04:15

Vorheriges Thema - Nächstes Thema

87insane

#15
Hi nochmal,

ich habe nun echt viel rum probiert aber es fällt mir schwer.

Verständnis-frage:

$credential.Password | ConvertFrom-SecureString | Set-Content $PWDFile
sollte NUR den PW Teil (konvertiert) in die Datei packen. korrekt?

Also sollte:
$credential | ConvertFrom-SecureString | Set-Content $PWDFile
Alles in die Datei packen? (Benutzer und PW)

Hier auch Edit: ist natürlich Quark weil dann kein string existiert.




$encrypt = Get-Content $PWDFile | ConvertTo-SecureString
Sollte alles aus der Datei wieder einlesen, konvertieren und in $encrypt packen?

$cred = New-Object System.Management.Automation.PsCredential($encrypt)
Sollte also nun UserName und Passwort enthalten?

Dann müsste:
$PWDFile="C:\Users\test_user\test\pwfile.txt"

#Wenn Passwort nicht gespeichert vorhanden passwort abfragen und File erzeugen
If (-not (test-path $PWDFile)) {
    $cred = Get-Credential
    $cred.Password | ConvertFrom-SecureString | Set-Content $PWDFile
    }

#Credential aus Passwort Datei und Username erzeugen
$encrypt = Get-Content $PWDFile | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential($encrypt)

$cred.UserName
$cred.Password


Ausgabe:
PS C:\Users\test_user\test> C:\Users\test_user\test\test.ps1

UserName Password
-------- --------
                 


zumindest den User ausgeben oder?

Ich würde gerne Benutzer und PW in die Datei packen und den UserNamen nicht festlegen. Der kann sich ja auch ändern. So bekomme ich zumindest keinen Debug Fehler.

Mit
$credential.GetNetworkCredential().Password
$credential.GetNetworkCredential().UserName


bekomme ich:
Ausnahme beim Aufrufen von "GetNetworkCredential" mit 0 Argument(en):  "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
In C:\Users\christk1\Downloads\test.ps1:29 Zeichen:1
+ $cred.GetNetworkCredential().Password
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : NullReferenceException

Ausnahme beim Aufrufen von "GetNetworkCredential" mit 0 Argument(en):  "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."
In C:\Users\christk1\Downloads\test.ps1:30 Zeichen:1
+ $cred.GetNetworkCredential().UserName
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : NullReferenceException



Wie kann man ein "unsichtbares" Szenario am besten testen? bzw wo habe ich den Denkfehler?

Edit: oder muss ich den AES key zwangsläufig alleine in eine Datei packen und Benutzernamen + konfig (ip,Topic usw) in eine andere Datei? Am liebsten hätte ich am ende eine Datei in der konfig + AES ist.

Otto123

#16
Aus meiner Sicht machst Du es einfach falsch :(
In der Datei steht nur ein verschlüsselter String. Dieser wird erzeugt aus:
dem User
dem Passwort
dem Computer/Maschinen Zertifikat/Schlüssel.

Um das Passwort aus diesem String auszulesen brauchst Du:
den gleichen Computer
den User

Alles aus dem verschlüsselten String auslesen funktioniert meines Wissens nicht. Den User musst Du angeben.
https://www.script-example.com/powershell-password

Deine Fehlermeldung zum Schluss sagt mir: Da wurde kein Objekt erzeugt. $cred oder $credential existiert nicht.

Du kannst natürlich mehr Dinge in die Datei packen, dann musst Du das Format selbst organisieren.
Du kannst Dir  z.B. ein Objekt zusammenbauen und dieses Objekt mit Export-Clixml in eine Datei schreiben und später mit Import wieder reinholen.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

Okay. Dachte das ich aus dem was drin steckt auch alles wieder decodieren kann. Das es der gleiche user usw sein müssen ist okay und war beabsichtigt.

Da ich aber in credentials benutzer u pw eingebe, muss ich das ja auch verwerten können. Aber dann werde ich den user einfach nochmal separat weg schreiben. Vermutlich komme ich dann um eine saubere config XML nicht drumherum. Aber eine super übung ist es am ende trotzdem.

Bezüglich dem nicht erzeugtem Objekt. Ja da habe ich mist gepostet. Ich hatte bereits eine pw Datei aus einem Test davor. Diese hat er gelesen und deswegen auch nicht die user Daten erneut abgefragt. Somit gab es auch keinen Fehler im ersten Abschnitt nachdem ich .password (den String zum verschlüsseln) weg nahm. Immerhin habe ich es später auch bemerkt und du hast es beim lesen schon gesehen. Danke für den Anstoß!

Gesendet von meinem LG-H850 mit Tapatalk


Otto123

#18
So steht anschließend alles in einer XML datei:
$ObjectFile="obj.xml"

#Wenn Object nicht gespeichert User und Passwort abfragen und File erzeugen
If (-not (test-path $ObjectFile)) {
    $credential = Get-Credential
    $credential |Export-Clixml $ObjectFile
    }


Mit $cred=Import-Clixml $ObjectFile bekommst Du das Objekt zurück.
Kontrolle:
$cred.GetNetworkCredential().UserName
$cred.GetNetworkCredential().Password


Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

#19
So kann ich den User mit eingeben und er ist variabel....
Nun beschäftige ich mich mal mit der XML Sache...

$PWDFile="C:\Users\benutzername\Desktop\PS\pwfile.txt"

#Wenn Passwort nicht gespeichert vorhanden passwort abfragen und File erzeugen
If (-not (test-path $PWDFile)) {
    $credential = Get-Credential
    $UserName = $credential.UserName
    $credential.Password | ConvertFrom-SecureString | Set-Content $PWDFile

    }

#Credential aus Passwort Datei und Username erzeugen
$encrypted = Get-Content $PWDFile | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential($UserName, $encrypted)

$credential.UserName
$credential.Password


Werde versuchen via Clixml alles in eine Datei zu bekommen. Bei der Verschlüsselung werde ich bleiben. Die ist super und x mal besser als plain Text.


In PS muss ich mein Wissen genau wie in PERL noch weit ausbauen... Wobei ich jetzt schon sagen kann, PS finde ich etwas schöner.


EDIT: HÖ!? Jetzt bin ich verwirrt... Wird automatisch in xml verschlüsselt? Erst mal googlen........

Otto123

#20
Verschlüsselt wird doch im credential Objekt - bleib ganz ruhig! Nicht googeln einfach meinen Code oben nehmen! Ich hatte editiert :)

Oder habe ich da einen Denkfehler? ???
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

Naja ich bin in so fern verwundert, da ich ja null Ahnung habe und mich bei jedem Stichwort erstmal einlesen muss.
Vorher war es ein langer Code um in eine txt o.ä. mit verschlüsseltem Inhalt zu erzeugen. Nun sind es ein paar sehr einfache Zeilen, die direkt in xml ein nicht lesbares PW erzeugen.

Kannst du erklären wieso:
$PWDFile="pwfile.txt"

#Wenn Passwort nicht gespeichert vorhanden passwort abfragen und File erzeugen
If (-not (test-path $PWDFile)) {
    $credential = Get-Credential
    $UserName = $credential.UserName
    $credential.Password | ConvertFrom-SecureString | Set-Content $PWDFile
    }

#Credential aus Passwort Datei und Username erzeugen
$encrypted = Get-Content $PWDFile | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential($UserName, $encrypted)

$credential.UserName
$credential.Password


gegen:
$ObjectFile="obj.xml"

#Wenn Object nicht gespeichert User und Passwort abfragen und File erzeugen
If (-not (test-path $ObjectFile)) {
    $cred = Get-Credential
    $cred |Export-Clixml $ObjectFile
    }

    $cred=Import-Clixml $ObjectFile

    $cred.GetNetworkCredential().UserName
    $cred.GetNetworkCredential().Password


so viel einfacher ist? Es muss doch einen Nachteil geben...?

Otto123

Ja Du kannst Recht haben mit der Verschlüsselung:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/convertfrom-securestring?view=powershell-6
Ich weiß jetzt noch nicht genau, was der Unterschied zwischen einem secure string und encrypted standard string ist.

Eventuell ist der secure String bloß ein hash und nicht wirklich verschlüsselt.

Die Idee mit dem credential Objekt und Export in XML kam mir ja später. :) Im Laufe der Entwicklung wird manches auch einfacher :)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

#23
https://itluke.online/2018/11/17/what-is-the-difference-between-a-secure-string-and-an-encrypted-string/

Ich werde mal versuchen es als Gemisch zu nutzen. So das in der xml der gleiche Sicherheitsstandard herrscht wie in deinem ersten Code. Das wäre dann ja das beste.


$config="config.xml"

#Wenn Passwort nicht gespeichert vorhanden passwort abfragen und File erzeugen
If (-not (test-path $config)) {
    $cred = Get-Credential
    $UserName = $cred.UserName
    $cred.Password | ConvertFrom-SecureString | Export-Clixml $config

    }

#Credential aus Passwort Datei und Username erzeugen
$encrypt = Import-Clixml $config | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential($UserName, $encrypt)

$cred.UserName
$cred.Password



irgendwie so.... mal sehen ob das alles klappt..
Brauche nur für den User noch eine Idee...bzw muss alles mit exportieren...

Otto123

Hmmm der Link erklärt zwar umfangreich den Inhalt von secure String - aber der wirkliche Unterschied der Verschlüsselung von Secure String und encryted Standard String wird mir nicht klar. Beide sind verschlüsselt. Steht auch in dem Artikel.

Ich meine, Du könntest jetzt den kompletten XML Text nehmen und als encrypted Standard String speichern ... Aber ob das gut ist? Dazu müsste man noch mehr lesen.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

#25
Sooo für heute habe ich genug aber jede Menge geschafft. Gerne für morgen Verbesserungs-Wünsche. Denke mal, man kann irgendwie direkt pipen anstelle meines langen Examples, die Variablen in die xml zu schreiben.
Habe einen Wizard drum gebaut. Bin gespannt was du sagst.

An sich behalte ich die Verschlüsselung vom Anfang bei aber schreibe alle Infos in eine XML. Ausgabe am Ende geht auch. Habe noch nicht mit MQTT getestet aber es geht ja erst mal um das Gerüst. Hat ein wenig länger gedauert da ich erst die XML Struktur halbwegs hinbekommen wollte.

#Wenn config Datei nicht vorhanden
If (-not (test-path config.xml)) {
   
    # Auflistung der Audio Geräte
    Get-AudioDevice -List

    # Abfrage der Variablen
    $dev1 = Read-Host "Enter first Device ID"
    $dev2 = Read-Host "Enter second Device ID"
    $serverip = Read-Host "Enter IP-Adress of MQTT Server"
    $conid = Read-Host "Choose a MQTT connection ID"
    $topic = Read-Host "Choose a MQTT Topic"
    $cred = Get-Credential
    $usr = $cred.UserName
    $pw = $cred.Password | ConvertFrom-SecureString
   
    #### Leere XML Datei erstellen ####
    $xmlcreate = New-Object System.Xml.XmlTextWriter("config.xml",$NULL)
    #### Formatierung in XML Datei anpassen ####
    $xmlcreate.Formatting = "Indented"
    $xmlcreate.Indentation = 1
    $xmlcreate.IndentChar = "`t"
    #### Inhalt für XML Datei ####
    $xmlcreate.WriteStartDocument()
    $xmlcreate.WriteStartElement("list")
    $xmlcreate.WriteElementString("SoundDevice1",$dev1)
    $xmlcreate.WriteElementString("SoundDevice2",$dev2)
    $xmlcreate.WriteElementString("MQTTServerIP",$serverip)
    $xmlcreate.WriteElementString("ConnectionID",$conid)
    $xmlcreate.WriteElementString("MQTTTopic",$topic)
    $xmlcreate.WriteElementString("UserName",$usr)
    $xmlcreate.WriteElementString("Password",$pw)
    $xmlcreate.WriteEndElement()
    #### XML Datei beschreiben ####
    $xmlcreate.WriteEndDocument()
    $xmlcreate.Flush()
    $xmlcreate.Close()

    }

# config.xml einlesen und durchsucbar machen
[xml]$config = Get-Content "config.xml"

# Passwort aus XML entschlüsseln und einlesen
$encrypt = $config.list.Password | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential($config.list.UserName, $encrypt)

# Aktuelle Test Ausgabe
$cred




EDIT: Ich glaube nach dem 10 mal habe ich es nun auch verstanden....
$cred = New-Object System.Management.Automation.PsCredential($config.list.UserName, $encrypt)
kann nicht gehen das der User der es entschlüsselt nicht der ist, den man eingibt sondern der User, der am PC angemeldet war, während es verschlüsselt wurde?

Also ich hab den String in $config.list.Password und da kommt er auch an. Aber das PW geht so auf jeden Fall nicht. Da ich als WIN User natürlich nicht pi habe. Aber dann könnte man doch einfach die System Variable nehmen anstelle von $config.list.UserName oder habe ich immer noch einen Hänger mit dem PW verschlüsseln? Mit dem kompletten Rest komme ich schneller und besser klar :-\

Otto123

Das Du dieses verschlüsselte Passwort nur an dem PC verwenden kannst an dem es erzeugt wurde habe ich aber von Anfang an gesagt.
Du kannst auf dem PC wo das Passwort verschlüsselt wurde, das Script laufen lassen. Auf einem anderen PC musst Du neu verschlüsseln, die Passwort Datei ist wertlos.
Ich habe jetzt nicht verstanden, dass Du das Powershell Script auf einem pi laufen lassen willst versteh ich nicht.

BTW ich habe hier noch einen guten Artikel.
Wenn das dort alles stimmt ist ein secure.string object auch begrenzt sicher im Speicher, da es gelöscht wird. Ein normaler system.string bleibt im Speicher. Mit der Verschlüsselung hat das nichts zu tun, der secure.string ist genauso verschlüsselt wie der String der durch convertfrom-SecureString erzeugt wird.

Du musst ja das powershell Script unter einem User laufen lassen. Mit dem User muss auch die verschlüsselung vorgenommen werden. Dieser User hat nichts mit dem UserName zu tun der bei get-credential angegeben wird. Das ist der Benutzer der zur Anmeldung am anderen System verwendet werden soll.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

#27
Guten Morgen,

ich denke in unserer Kommunikation ist was schief gelaufen :-\

ZitatDas Du dieses verschlüsselte Passwort nur an dem PC verwenden kannst an dem es erzeugt wurde habe ich aber von Anfang an gesagt.
Du kannst auf dem PC wo das Passwort verschlüsselt wurde, das Script laufen lassen. Auf einem anderen PC musst Du neu verschlüsseln, die Passwort Datei ist wertlos.
Das ist doch auch genau so gewollt. Dazu der Wizard, ist doch dann perfekt?! So kann jeder der das Skript nutzen will, seine Daten eingeben. Für mich alleine habe ich das nicht gebaut. Viel eher als Übung und für die Community.

ZitatIch habe jetzt nicht verstanden, dass Du das Powershell Script auf einem pi laufen lassen willst versteh ich nicht.
Also zurück zum Anfang.....
Das Skript soll auf einem WIN PC laufen. Es soll ermöglichen die Sound Devices zu wechseln und sendet das aktuelle Gerät an FHEM via MQTT. Wenn ich also an meinem PC den ersten Start des Skriptes mache, durchlaufe ich zuerst die Abfragen. Diese beinhalten:
    $dev1 = Erstes Sound Ausgabegerät
    $dev2 = Zweites Sound Ausgabegerät
    $serverip = IP-Adresse vom MQTT Server (bei mir z.B. FHEM MQTT2)
    $conid = Die eindeutige ID, die MQTT für Geräte benötigt
    $topic = MQTT Topic
    $usr = Benutzername um sich mit dem MQTT Server zu verbinden
    $pw = Passwort um sich mit dem MQTT Server zu verbinden
Nachdem der User das alles eingegeben hat, sendet das Script die Infos via MQTT an den Server. Deswegen habe ich ja auch alles in eine XML auslagern wollen. Da du mir da so tatkräftig geholfen hast ist auch nur noch eine Kleinigkeit offen.

ZitatBTW ich habe hier noch einen guten Artikel.
Wenn das dort alles stimmt ist ein secure.string object auch begrenzt sicher im Speicher, da es gelöscht wird. Ein normaler system.string bleibt im Speicher. Mit der Verschlüsselung hat das nichts zu tun, der secure.string ist genauso verschlüsselt wie der String der durch convertfrom-SecureString erzeugt wird.
Ich bin mir da auch noch nicht sicher was ich nun mache. Aktuell habe ich das getestet mit XML aber der Verschlüsselung von deiner ersten Idee. Ob das nicht sogar für so ein Skript ein wenig zu viel ist?

ZitatDu musst ja das powershell Script unter einem User laufen lassen. Mit dem User muss auch die verschlüsselung vorgenommen werden. Dieser User hat nichts mit dem UserName zu tun der bei get-credential angegeben wird. Das ist der Benutzer der zur Anmeldung am anderen System verwendet werden soll.
Das wurde mir erst gestern klar..... Ich in davon ausgegangen das der User, der sein muss, den ich auch eingebe. Aber nach deiner Beschreibung gestern, hatte ich das korrekt verstanden. Also der User, der auch angemeldet ist. (was auch am meisten Sinn macht).
ABER bei
$cred = New-Object System.Management.Automation.PsCredential("UserName", $encrypt)
ist der Name unerheblich. Das konnte ich testen und nachstellen. Ich weiß nicht warum man da überhaupt einen angeben muss aber dazu muss ich mir die Tage mal ein Test Skript bauen. Ich teste gerne so kleine Dinge mit Test-Skripten, einfach um es auch zu verstehen.




Gestern Abend hatte ich doch noch das fertige Skript getestet.... Also mit dem MQTT senden. Ich merkte aber das mein Rechner immer wieder sehr hoch ging von der CPU her. Da muss ich noch schauen warum. Vermutlich liegt es am Entschlüssen (wobei der Vorgang nur 1 Sekunde dauert).

Was mir auch aufgefallen ist:
- Egal ob der User, der die XML erzeugt hat und damit auch das PW - MQTT nimmt das Passwort nicht als $encrypt bzw cred. Ich musste beim Connect immer cred.GetNetworkCredential().Password verwenden. Bei Azure z.B. kann man direkt den AES encrypt Wert nehmen (hoffe man versteht mich). Da aber auch nur der Erzeuger des AES Keys das PW mit $cred.GetNetworkCredential().Password entschlüsseln kann, wäre das Skript eigentlich fertig. Nun ist nur die Frage ob 1. oder 2. PW Methode sinniger ist.

Ich Poste nun mal mein getestetes Skript aber es würde mich sehr freuen wenn man das noch optimieren könnte.

#Wenn config Datei nicht vorhanden ist, werden alle Variablen abgefragt um eine config.xml zu erstellen
If (-not (test-path config.xml)) {
   
    # Auflistung der Audio Geräte
    Get-AudioDevice -List

    # Abfrage der Variablen
    $dev1 = Read-Host "Enter first Device ID"
    $dev2 = Read-Host "Enter second Device ID"
    $serverip = Read-Host "Enter IP-Adress of MQTT Server"
    $conid = Read-Host "Choose a MQTT connection ID"
    $topic = Read-Host "Choose a MQTT Topic"
    $cred = Get-Credential
    $usr = $cred.UserName
    $pw = $cred.Password | ConvertFrom-SecureString
   
    #### Leere XML Datei erstellen ####
    $xmlcreate = New-Object System.Xml.XmlTextWriter("config.xml",$NULL)
    #### Formatierung in XML Datei anpassen ####
    $xmlcreate.Formatting = "Indented"
    $xmlcreate.Indentation = 1
    $xmlcreate.IndentChar = "`t"
    #### Inhalt für XML Datei ####
    $xmlcreate.WriteStartDocument()
    $xmlcreate.WriteStartElement("list")
    $xmlcreate.WriteElementString("SoundDevice1",$dev1)
    $xmlcreate.WriteElementString("SoundDevice2",$dev2)
    $xmlcreate.WriteElementString("MQTTServerIP",$serverip)
    $xmlcreate.WriteElementString("ConnectionID",$conid)
    $xmlcreate.WriteElementString("MQTTTopic",$topic)
    $xmlcreate.WriteElementString("UserName",$usr)
    $xmlcreate.WriteElementString("Password",$pw)
    $xmlcreate.WriteEndElement()
    #### XML Datei beschreiben ####
    $xmlcreate.WriteEndDocument()
    $xmlcreate.Flush()
    $xmlcreate.Close()
    }

# config.xml einlesen und durchsucbar machen
[xml]$config = Get-Content "config.xml"

# Passwort aus XML einlesen und entschlüsseln
$encrypt = $config.list.Password | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential("Username", $encrypt)

# Index der Wiedergabegeräte im System - Vorher mit Get-AudioDevice -List prüfen
$dev1=$config.list.SoundDevice1
$dev2=$config.list.SoundDevice2

# Auslesen des aktiven Ausgabe-Geräts mit Index
$aplayindex = (Get-AudioDevice -Playback).Index
$aplayname = (Get-AudioDevice -Playback).Name

# Auslesen des aktiven Aufnahme-Geräts mit Index
$arecindex = (Get-AudioDevice -Recording).Index
$arecname = (Get-AudioDevice -Recording).Name

# Geräte-Toogle
if ($aplayindex -eq $dev1) {
        $indexnum=$dev2
    } elseif ($aplayindex -eq $dev2) {
        $indexnum=$dev1
    }

# Setzen des prim. Gerätes
Set-AudioDevice -Index $indexnum > $null

$cred.GetNetworkCredential().password
######### Ab hier MQTT #########

# dll reggen
Add-Type -Path "C:\lib\M2Mqtt.4.3.0.0\lib\net45\M2Mqtt.Net.dll"

# Verbinden
$MqttClient = [uPLibrary.Networking.M2Mqtt.MqttClient]($config.list.MQTTServerIP)

# Einloggen
$mqttclient.Connect($config.list.ConnectionID, $config.list.UserName, $cred.GetNetworkCredential().password)

# Nachrichten senden mit QOS 1 (0 = Keine Prüfung / 1 = Nachricht kommt mindestens 1 mal an / 2 = Nachricht kommt maximal 1 mal an) - Kein WillReatin
$MqttClient.Publish($config.list.MQTTTopic+"/play_dev_index", [System.Text.Encoding]::UTF8.GetBytes("$aplayindex"),1,0)
$MqttClient.Publish($config.list.MQTTTopic+"/play_dev_name", [System.Text.Encoding]::UTF8.GetBytes("$aplayname"),1,0)
$MqttClient.Publish($config.list.MQTTTopic+"/rec_dev_index", [System.Text.Encoding]::UTF8.GetBytes("$arecindex"),1,0)
$MqttClient.Publish($config.list.MQTTTopic+"/rec_dev_name", [System.Text.Encoding]::UTF8.GetBytes("$arecname"),1,0)

# 5 Sekunden Delay
for ($i=0; $i -lt 5; $i++)
{
    Start-Sleep 1
}

# Verbindung schließen
$MqttClient.Disconnect()

Otto123

Moin,

bevor ich zum testen komme ganz kurz:
ZitatABER bei
$cred = New-Object System.Management.Automation.PsCredential("UserName", $encrypt)
ist der Name unerheblich.
Naja ich hatte auch so verstanden, dass nur das Passwort verschlüsselt als System String nach $encrypt gegeben wird.
Aber! Du kannst ja das $cred Objekt direkt nutzen z.B. um Laufwerke zu verbinden. Insofern ist es wichtig dort den richtigen UserName anzugeben.
Wenn Du aber aus $cred nur das Passwort im Klartext wieder herausziehen willst/musst ist der UserName natürlich egal.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

87insane

Jo. Das ist also erstmal sicher und läuft soweit.

Nach wie vor ist die Frage ob 1. oder zweite PW Methode. Ich werde das Skript ggf. auch noch ein wenig variabler machen. Man könnte eine Art Schleife bauen und der User kann sich selber aussuchen wie viele Nachrichten er versenden will und wie die Readings in FHEM heißen. Dazu würde ich noch eine Anleitung bezüglich MQTT Client installieren schreiben.

Dann könnte jeder seinen WIN PC in einen MQTT Client für FHEM nutzen. Ich selber finde das super aber natürlich ist es das gleiche wie der HTTP Connector, nur eben über einen anderen Weg. Was hältst du von dem Projekt?