none
Enabledelayedextension in Powershell

    Frage

  • Moinmoin

    ich versuche gerade ein automatisches, universelles und sehr dynamisches Netzlogin-Script zu schreiben.

    Die Idee ist eine Datei mit den zu verbindenden Shares zu erstellen, die dann abgearbeitet werden.

    Z.B.: server_connect.lan

    S;\\192.168.0.1\share;192.168.0.1\user;password
    T;\\$dhcpserver\service;$dhcpserver\user;password

    Diese wird nun Zeile für Zeile abgearbeitet und soll nun verbinden:

    $dhcpserver="192.168.0.1" Clear-Host Foreach ($line in Get-Content .\server_connect.lan | Where-Object {$_ -notmatch"^#"}) { $sharelett=$line.Split(";")[0]; $shareletter=$sharelett + ':' $sharename=$line.Split(";")[1] $shareuser=$line.Split(";")[2] $sharepass=$line.Split(";")[3]

    Write-Host dhcpserver----shareletter----sharename----shareuser----sharepass Write-Host $dhcpserver---$shareletter---$sharename---$shareuser---$sharepass }



    (In dem Script habe ich $dhcpserver manuell definiert - in Echt wir diese dynamisch ermittelt.)

    Das Problem is nun dass in der zweiten Zeile (für Laufwerksbuchstabe T) eben diese Variable $dhcpserver nicht aufgelöst wird.

    Write-Host gibt bei $sharename \\$dhcpserver\service aus und nicht \\192.168.0.1\service

    Wie kann ich es erreichen dass $dhcpserver aufgelöst wird?



    • Bearbeitet logg.sar Donnerstag, 11. Januar 2018 18:47
    Donnerstag, 11. Januar 2018 16:28

Antworten

  • Gibts hier eigentlich die Möglichkeit von PNs?

    Wenn ich dir die Umgebung erkläre in der ich arbeite wirst sehen dass Deine Argumente zwar prinzipiell richtig sind, aber hier nicht greifen. Deswegen überlese ich auch die mehrfachen Andeutungen in richtung professioneller Unterstützung :D

    Allerdings mag und wede ich das nicht so öffentlich machen ;)

    However - ich habs erst mal gelöst - nicht mit Invoke-Expression, sondern mit einem einfachen -replace (wie es der scripting guy in seinem Blog beschrieben hat - als er noch aktiv war)

    Danke für die Tipps - mit der CSV-Datei hast recht, da hätte ich selber dran denken können.

    • Als Antwort markiert logg.sar Montag, 15. Januar 2018 08:38
    Freitag, 12. Januar 2018 15:43

Alle Antworten

  • zwar keine Powershell Antwort aber als Anregung: warum nimmst du nicht Gruppenrichtlinien?

    Chris

    Donnerstag, 11. Januar 2018 17:07
  • Moin,

    zuerst mal - bitte keinen farbigen Code posten. Stattdessen die dafür vorgesehen Formatierungsoption im Posteditor verwenden. Das vermeidet ungewollte Zeilenumbrüche und macht den Code besser lesbar und somit auch besser verständlich.

    Meine Empfehlung wäre, das Rad nicht neu zu erfinden und Deine "Steuerdatei" als CSV-Datei zu behandeln. Das Format sieht sowieso schon danach aus - Du brauchst nur noch eine Header-Zeile. Damit hast Du es supi-einfach diese einzulesen und auf die einzelnen Werte zuzugreifen. Die könnte z.B. dann so aussehen:

    LW;Share;User;PW
    S;\\192.168.0.1\share;192.168.0.1\user;password
    T;\\EinAndererServer\service;EinAndererServer\user;password

    Dann kannst Du mit den dafür vorgesehenen cmdlets arbeiten. Das ist einfacher und sieht besser aus. Angenommen die datei heißt "Server_Connect.csv", dann könntest Du so anfangen:

    Import-CSV -Path 'Server_Connect.csv' -OutVariable Steuerdaten | 
        ForEach-Object {
            Write-Host "$_.LW --- $_.Server --- $_.Share --- $_.PW"
            ## ... mehr code
        }

    ... aber eigentlich brauchst das Write-Host gar nicht (das ist sowieso sehr schlechter Stil), Du kannst Die in der Variablen "$Steuerdaten" enthaltene "Tabelle" einfach ausgeben:

    $Steuerdaten

    ;-)

    Ich möchte Dir dringend empfehlen, die Grundlagen von Poswershell zu erlernen. Das erspart Dir eine Menge Frustration und Zeitverschwendung und zahlt sich bestimmt für Dich aus in Zukunft. Ein guter Einstieg gelingt mit dem kostenlosen Video-Kurs in der MVA: Microsoft Virtual Academy - Getting Started with Microsoft PowerShell.

    Bereits fertige Scripte findest Du hierPowerShell Gallery oder hier: TechNet Gallery - resources for IT professionals. (Auch gut zum "Abgucken" geeignet)

    Na dann: Good luck and have a lot of fun!


    Best regards,

    (79,108,97,102|%{[char]$_})-join''



    • Bearbeitet BOfH_666 Donnerstag, 11. Januar 2018 18:31
    Donnerstag, 11. Januar 2018 18:18
  • Moin,

    zuerst mal - bitte keinen farbigen Code posten. Stattdessen die dafür vorgesehen Formatierungsoption im Posteditor verwenden. Das vermeidet ungewollte Zeilenumbrüche und macht den Code besser lesbar und somit auch besser verständlich.

    An das hab ich tatsächlich nicht gedacht. Ich habs aus VisualStudio rauskopiert - eigentlich beides, aber nur bei der PS1-Datei ist die Formatierung beibehalten worden

    Meine Empfehlung wäre, das Rad nicht neu zu erfinden und Deine "Steuerdatei" als CSV-Datei zu behandeln.   

    Stimmt, an das habe ich nicht gedacht. Werde ich morgen mal testen.

    ... aber eigentlich brauchst das Write-Host gar nicht (das ist sowieso sehr schlechter Stil)

    Ist mir klar - ich hab das Write-Host nur zur verdeutlichung hingeschrieben. In meinem Script gehts mit new-smbshare weiter ;)

    Mal abgesehen davon - ich vermute dass die Variable nicht aktualisiert wird da es als string und nicht als Objekt ausgelesen wird. Stimmt es so?

    Wie könnte ich da ein Objekt draus machen? Andersherum gehts ja....

    Donnerstag, 11. Januar 2018 18:43
  • Ist mir klar - ich hab das Write-Host nur zur verdeutlichung hingeschrieben. In meinem Script gehts mit new-smbshare weiter ;)

    So weit klar ... für "Wegwerf-Scripte" geht das irgendwie schneller und wer lebt schon in einer perfekten Welt?  ;-)  Die passende Empfehlung dazu für "produktive" Scripte lautet Write-Verbose, Write-Debug oder Write-Information. Das kann man dann mit den entsprechenden Paramtern ganz nach Lust und Laune ein- ober abschalten.

    Mal abgesehen davon - ich vermute dass die Variable nicht aktualisiert wird da es als string und nicht als Objekt ausgelesen wird. Stimmt es so?

    Wie könnte ich da ein Objekt draus machen? Andersherum gehts ja....

    Ohne den kompletten / relevanten Code und eventuell auftretende Fehlermeldungen zu sehen, können wir da leider auch nur raten. Du könntest es mit Invoke-Expression versuchen. Damit kann man in Text enthaltene Ausdrücke "validieren". Aber vielleicht ist das ja auch gar nicht nötig. Es gibt fast immer mehrere Lösungen für eine gegebene Aufgabenstellung, und manchmal sind die wirklich einfachen oder eleganten Lösungen nicht offensichtlich, oder es fehlt einem an Erfahrungen. Aber dafür gibt's ja dann eben Foren wie dieses hier. ;-)

    .... und das mit dem richtigen Zitieren kriegst auch noch hin.  ;-) :-D


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Donnerstag, 11. Januar 2018 23:21
  • Ohne den kompletten / relevanten Code und eventuell auftretende Fehlermeldungen zu sehen, können wir da leider auch nur raten.

    Beim New-Smbshare kommt die der Error Code 53 (Netzwerkpfad nicht gefunden).

    Eigentlich klar und verifiziert, da 

    New-SmbMapping -LocalPath S: -RemotePath \\$dhcpserver\share -Username 
    \\$dhcpserver\user -Password password -Persistent $true

    das nicht funktionieren kann da der Remotepath \\$dhcpserver nicht korrekt sein kann! Weder beim Usernamen noch beim User.

    New-SmbMapping -LocalPath S: -RemotePath \\192.168.0.1\share -Username 
    \\192.168.0.1\user -Password passwort -Persistent $true

    Das hingegen geht - weil die Variable $dhcpserver aufgelöst wird.



     

    .... und das mit dem richtigen Zitieren kriegst auch noch hin.  ;-) :-D


    Neeeeee

    Vielleicht muss ich tatsächlich Edge installieren - mit Opera ist es eine Qual...

    • Bearbeitet logg.sar Freitag, 12. Januar 2018 07:59
    Freitag, 12. Januar 2018 07:57
  • Du hast in der Input-Datei "$dhcpserver" drinstehen? Da hilft dann wirklich nur Invoke-Expression.

    Und über Kennwörter in Skripts hab ich eine eigene Meinung, die nicht deiner entsprechen dürfte...

    Freitag, 12. Januar 2018 08:11
  • Vielleicht muss ich tatsächlich Edge installieren - mit Opera ist es eine Qual..

    Ich benutze zwar nur Chrome und Firefox, aber ich kann mir gar nicht vorstellen, dass der Post-Editor in anderen Browsern so viel anders aussieht.

    Wenn Du $DHCPServer sowieso für alle gleich definierst, brauchst Du ihn ja auch nicht "dynamisch" aus der Steuerdatei lesen.

    Vielleicht beschreibst Du uns nochmal in "prosa", was Du eigentlich erreichen möchtest. Vielleicht haben wir ja noch Ideen, wie Du das ganze eleganter, sicherer, einfacher, robuster usw. lösen kannst.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 12. Januar 2018 08:34
  • Es soll ein äussert universelles Netzwerk-Script werden. Neben dem Script können noch zwei dateien vorhanden sein.

    Eine server_connect.ip mit einer ip-adresse, einer subnetzmaske und einem gateway.

    Eine server_connect.lan mit Laufwerksbuchstabe,Server\share,username passwort.

    Als erstes wird festgestellt ob DHCP aktiviert ist oder nicht. Dabei wird auch die Variable $dhcpserver gefüllt.

    Falls ja, aber ne apipa adresse soll das system warten.

    Falls dhcp nicht aktiv ist wird die server_connect.ip ausgelesen und die vorhandene adresse statisch gesetzt (netsh - das ist so weit durch)

    Dann sollen die in der server_connect.lan die laufwerke verbunden werden.

    Die Kollegen sollen dann nur bei bedarf eine der zwei dateien anpassen, alles andere soll automatisch klappen.

    Freitag, 12. Januar 2018 12:57
  • Hmmmm .... wow .... nagut ... der Vertrieb hat heute Kuchen spendiert, also hab ich gute Laune! ;-) :-D

    Es soll ein äussert universelles Netzwerk-Script werden. Neben dem Script können noch zwei dateien vorhanden sein.

    Je universeller/komplexer, desto weniger robust und desto fehleranfälliger wird es meistens.

    Eine server_connect.ip mit einer ip-adresse, einer subnetzmaske und einem gateway.

    Wie oben schon erwähnt, halte ich eine CSV-Datei für besser geeignet. Ich würde empfehlen, mit so vielen "Standards" zu arbeiten wie möglich.

    Eine server_connect.lan mit Laufwerksbuchstabe,Server\share,username passwort.

    Wenn es nicht um eine private Umgebung geht, ist das ein ganz schlechte Idee. Wenn Du Benutzername und Passwort in eine Klartextdatei schreibst, kannst Du sie auch gleich weglassen. Das ist, wie das Haus abzuschließen, aber den Schlüssel stecken zu lassen. Warum werden die Kollegen nicht auf die Freigaben berechtigt? Dann greifen sie mit ihren eigenen Rechten darauf zu und nicht alle mit den selben.

    Als erstes wird festgestellt ob DHCP aktiviert ist oder nicht. Dabei wird auch die Variable $dhcpserver gefüllt.

    OK - das können wir so durchgehen lassen. ;-)

    Falls ja, aber ne apipa adresse soll das system warten.

    Worauf? Wie lange?

    Falls dhcp nicht aktiv ist wird die server_connect.ip ausgelesen und die vorhandene adresse statisch gesetzt (netsh - das ist so weit durch)

    Na wenn das durch ist, brauch ich da ja keinen Kommentar zu abgeben.

    Dann sollen die in der server_connect.lan die laufwerke verbunden werden.

    OK, soweit auch klar. Bis auf die Einschränkung mit den Namen und Passwörtern von oben ....

    Die Kollegen sollen dann nur bei bedarf eine der zwei dateien anpassen, alles andere soll automatisch klappen.

    Nach meiner Erfahrung ist das eine ganz schlechte Idee - sorry. Das birgt eigentlich nur großes Potenzial für ne Menge Fehler und Supportanfragen.

    Warum werden die Laufwerke nicht per Gruppenrichtlinie verbunden? Das ist der von Microsoft empfohlene Weg. Versteh mich bitte nicht falsch. Man kann das alles so machen, aber meiner Meinung nach, machst Du Dir das Leben selbst unnötig schwer und baust dabei auch noch Security-Scheunentore in Deine IT-Infrastruktur. Ich würde Dir empfehlen, das Verfahren nochmal zu überdenken und Dir gegebenenfalls nochmal professionelle Unterstützung zu holen.


    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 12. Januar 2018 15:22
  • Gibts hier eigentlich die Möglichkeit von PNs?

    Wenn ich dir die Umgebung erkläre in der ich arbeite wirst sehen dass Deine Argumente zwar prinzipiell richtig sind, aber hier nicht greifen. Deswegen überlese ich auch die mehrfachen Andeutungen in richtung professioneller Unterstützung :D

    Allerdings mag und wede ich das nicht so öffentlich machen ;)

    However - ich habs erst mal gelöst - nicht mit Invoke-Expression, sondern mit einem einfachen -replace (wie es der scripting guy in seinem Blog beschrieben hat - als er noch aktiv war)

    Danke für die Tipps - mit der CSV-Datei hast recht, da hätte ich selber dran denken können.

    • Als Antwort markiert logg.sar Montag, 15. Januar 2018 08:38
    Freitag, 12. Januar 2018 15:43
  • Gibts hier eigentlich die Möglichkeit von PNs?

    Nope. :-)

    Wenn ich dir die Umgebung erkläre in der ich arbeite wirst sehen dass Deine Argumente zwar prinzipiell richtig sind, aber hier nicht greifen.

    Ich weiß was Du meinst - hab auch schon viel gesehen und gehört. Das heißt aber nicht, dass man aufgeben sollte. Ich hoffe nur, dass Du dann nicht irgendwann geköpft wirst, wenn es mal richtig kracht und Du es "verbrochen" hast. ;-)

    Allerdings mag und wede ich das nicht so öffentlich machen ;)

    Um Himmels Willen ... das wär ja dann gleich ein Kündigungsgrund. ... und ist auch nicht nötig.

    However - ich habs erst mal gelöst - nicht mit Invoke-Expression, sondern mit einem einfachen -replace (wie es der scripting guy in seinem Blog beschrieben hat - als er noch aktiv war)

    Na dann drück ich die Daumen, dass es lange und zuverlässig wie gewünscht funktioniert. Und Du kannst es ja vielleicht im Laufe der Zeit doch noch verbessern.

    Danke für die Tipps - mit der CSV-Datei hast recht, da hätte ich selber dran denken können.

    Jederzeit. Dafür ist das Forum ja da.
    Schönes WE!

    Best regards,

    (79,108,97,102|%{[char]$_})-join''

    Freitag, 12. Januar 2018 16:01