Quantcast
Channel: Windows PowerShell Forum
Viewing all 2314 articles
Browse latest View live

Start-Job und PriorityClass

$
0
0

Hallo,

heute ist mir aufgefallen, dass mein Skript viel CPU Leistung frisst. Und es liegt an den Jobs die gestartet werden. Dachte zuerst: Nichts einfacher als das und die PriorityClass runter setzen. Naja, es gibt nen Unterschied zwischen Prozess und Job. 

Also ich habe zwei Jobs, beides Skripte, einer wartet in Dauerschleife auf einen bestimmten KeyState und geht in den State completed, Der zweite Job ist eine Art Timer, der übergeben bekommt wie viele Minuten er nichts machen soll. Auch da wird dann im Main Skript auf .state -eq "Completed" geprüft. Bei beiden ist es wichtig das sie parallel zu Main laufen.

Nun meine Frage: Wie kann ich die CPU Leistung verringern? Gibt es einen anderen Weg mit Jobs die Priority zu ändern? Oder die allg. im Hintergund laufen zu lassen, das sie die Kerne nicht belassen? Arbeite seit kurzem mit Powershell und kenne mich jetzt nicht super damit aus.

mfg werdas34


Eine Funktionen - einmal Main und einmal Backgroundjob

$
0
0

Hallo,

ich habe folgendes Problem. Ich habe in Main eine Funktion definiert und für den Start-Job auch nochmal dieselbe Funktion. Warum zweimal? Der Backgroundjob hat einen eigenen Scope und kann nicht auf die Main zugreifen. Ich hätte allerdings gerne die Funktion nur einmal definiert und dann den Job die mitgegeben.

Aktueller Stand(aus dem Kopf, kann also fehlerhaft sein) :

function test{
    #blabla
}

Start-Job $job -ScriptBlock{function test{#blabla}}

test

Mein Ziel wäre es sowas:

function test{
    #blabla
}

Start-Job $job -ScriptBlock{function test}

test

Ich möchte also nur einmal die Funktion definieren, aber sowohl im Main als auch im Backgroundjob verwenden. Wie mache ich das?

Funktion, um die es gerade geht:

function Get-KeyState([uint16]$keyCode)
{
  $signature = '[DllImport("user32.dll")]public static extern short GetKeyState(int nVirtKey);'
  $type = Add-Type -MemberDefinition $signature -Name User32 -Namespace GetKeyState -PassThru
  return [bool]($type::GetKeyState($keyCode) -band 0x80)
} 

Ich habe schon 2 Tage alles versucht. Ich hoffe ihr könnt mir behilflich sein.

mfg werdas34

int Variablen sortieren und weitergeben (Schell5.1)

$
0
0

Guten Abend,

in einem kleinen Powershell-Script habe ich vier Werte ausgelesen und Variablen zugeordnet:

$a1 = "-90", $a2 = "-39", $a3 = "-34", $a4 = "-91"

Mein Ziel ist es die ersten zwei, deren Wert über -50 liegt im Weiteren nutzen zu können. In diesem Fall also:

$a2, $a3

Leider scheitere ich an dieser mutmaßlich simplen Aufgabe. Da die Werte beim nächsten Auslesen völlig anders verteilt sein können, muss ich das für jeden Durchgang irgendwie per Schleife lösen. Die Frage ist nur wie?

Vergessen habe ich zu sagen, dass ich natürlich nicht an den Werten selbst, sondern an den Variablen mit >-50 interessiert bin.

Ich bin für jeden Tipp dankbar!

Viele Grüße,

Johannes



Script für das automatische Verschieben von Dateien in festgelegte Ordner

$
0
0

Hallo,

ich bin leider nicht sehr bewandert, was PowerShell Scripting angeht, aber wüsste gern, ob es eine Möglichkeit gibt, mithilfe eines solchen Scripts das automatische Verschieben von Dateien von einem zentralen Ordner in einen anderen, innerhalb des Scripts definierten Ordner zu verschieben.

Optimalerweise sogar in verschiedene Ordner, abhängig vom jeweiligen Prefix der Datei, beispielsweise: Datei "Lieferschein_12345.pdf" wird bei Ablegen in den zentralen Ordner automatisch in Order "Lieferscheine" verschoeben. Datei "Rechnung_12345.pdf" wird automatisch in Order "Rechnungen" verschoben.

Da ich selbst aus der Programmierung komme und weiß, dass das alles mit Aufwand verbunden ist, erfrage ich hier gar nicht konkret ein fertiges Script (zumindest nicht kostenlos), aber wenn mir jemand sagen könnte, ob dies überhaupt möglich ist, wäre mir schon weiter geholfen :-)

Vielen Dank im Voraus!

int Variablen sortieren und weitergeben

$
0
0

Guten Abend,

in einem kleinen Powershell-Script habe ich vier Werte ausgelesen und Variablen zugeordnet:

$a1 = "-90", $a2 = "-39", $a3 = "-34", $a4 = "-91"

Mein Ziel ist es die ersten zwei, deren Wert über -50 liegt im Weiteren nutzen zu können. In diesem Fall also:

$a2, $a3

Leider scheitere ich an dieser mutmaßlich simplen Aufgabe. Da die Werte beim nächsten Auslesen völlig anders verteilt sein können, muss ich das für jeden Durchgang irgendwie per Schleife lösen. Die Frage ist nur wie?

Vergessen habe ich zu sagen, dass ich natürlich nicht an den Werten selbst, sondern an den Variablen mit >-50 interessiert bin.

Ich bin für jeden Tipp dankbar!

Viele Grüße,

Johannes




CSV-Export - RAM-Auslastung steigt ins unermessliche bei Dauerbetrieb

$
0
0

Hallo,

ich habe ein Script geschrieben, welches im Dauerbetrieb laufen soll, d.h. 24/7. Das Script an sich lief schon zwei Wochen im Dauerbetrieb und hat wunderbar funktioniert.

Jetzt habe ich das Logging hinzugefügt und das Script soll die Daten an eine csv Datei exportieren. Das mache ich mit csv-Export. Funktioniert alles. Vor zwei Tagen wieder in den Dauerbetrieb aufgenommen. Gestern hat sich dann das System aufgehängt. Taskmanager zeigte gerade so noch 100% RAM-Auslastung an.

Hat jemand Erfahrung mit sowas und kann mir sagen was helfen könnte? Möchte ungern  mehrere Sachen ausprobieren, nur um jeweils paar Tage warten zu müssen, um die Ergebnisse zu sehen.

Ich schätze es liegt daran, dass Powershell die Datei nie von sich aus schließt. Und es sammeln sich Objekte an, die einmal in die Datei geschrieben werden und nicht gelöscht(?) werden.

Zwei Sachen fielen mir spontan ein: csv Prozess beenden oder Garbage Collector anschmeißen.

Wäre froh über jeden Tipp, der mir langes warten ersparen würde.

mfg werdas34

Inhalte aus Ergebnissen herausfiltern

$
0
0

Hallo,

ich wollte mir ein kleines Script schreiben, mit dem ich mir die Signalstärke des verbundenen Wlan-Netzwerkes anzeigen lassen kann, aber mein Problem ist, dass ich nur die Zeile angezeigt haben möchte, in der die Siganlstärke angezeigt steht.

netsh wlan show interfaces

-->

    Name                   : WLAN
    Beschreibung           : ...
    GUID                   : ...
    Physische Adresse      : ...
    Status                 : Verbunden
    SSID                   : ...
    BSSID                  : ...
    Netzwerktyp            : ...
    Funktyp                   : ...
    Authentifizierung   : ...
    Verschlüsselung        : ...
    Verbindungsmodus          : ...
    Kanal               : ...
    Empfangsrate (MBit/s)  : ...
    Übertragungsrate (MBit/s) : ...
    Signal              : 94%
    Profil                 : ...

    Status des gehosteten Netzwerks  : Nicht verfügbar

Gibt es ein Befehl, um aus den Ergebnissen einzelne Zeilen rauskopieren zu können, wenn man nur einzelne Wörter der Zeile kennt?

Vielen Dank schon mal im Voraus


GET-FileHash Frage

$
0
0

Hallo

Ich bin ein neuling was die PS betrifft und würde mich gern ein wenig is die basics einarbeiten. Dazu habe ich mir eine eigene aufgabe gestellt:

1. Zwei Files zu hashen und als "künfitgen" vergleichswert in eine Script Variable ablegen (damit habe ich mal kein Problem)

2. Diese zusammenführen und als einen Vergleichsstring zu führen

3. Auf anderen Rechnern die selben Files mit GET-FileHash auslesen und jeweils in eine Variable speichern.

4. Diese dann ebenfalls zusammenführen

5. Das Ergebnis der beiden zusammenführungen vergleichen und je nachdem ob ein unterschied ist, eine Meldung an den Benutzer liefern...

Soweit der Plan...ich habe dann aber bald bemerkt, dass die Werte aus dem get-filehash sich irgendwie nicht zusammenführen lassen...hier endet dann mein wissen, wie ich weiter komme.

Kurz mal mein erster Ansatz:

#Vergleichsvariblen definieren

$hashexe = "FA2AAFEE09BE9B98866767BF7D175E4A"
$hashjs = "1778724C3276245FC40E1B081D91E9E3"

#Vergleichsvariblen definieren und zusammenführen
$hashexe = "FA2AAFEE09BE9B98866767BF7D175E4A"
$hashjs = "1778724C3276245FC40E1B081D91E9E3"
$md5ref = $hashexe + "_" + $hashjs

#Pruefen (nur zum testen)
$md5ref

#Ab hier steck ich (variante 1)
$checkexe = @(Get-FileHash -Path "C:\tmp\client.exe" -Algorithm MD5 | Format-Wide -Property Hash)
$checkjs = @(Get-FileHash -Path "C:\tmp\client.js" -Algorithm MD5 | Format-Wide -Property Hash)
$md5check = $checkexe + "_" + $checkjs
#Prüfen (nur zum testen) output falsch
$md5check

#Variante 2 
[string[]]$checkexe = @(Get-FileHash -Path "C:\tmp\client.exe" -Algorithm MD5) | Format-Wide -Property Hash)
[string[]]$checkjs = @(Get-FileHash -Path "C:\tmp\client.js" -Algorithm MD5 | Format-Wide -Property Hash)
$md5check = $checkexe + "_" + $checkjs
#Prüfen (nur zum testen) output falsch
$md5check

#Variante 3
Set-Variable -Name "checkexe" -Value (Get-FileHash -Path "C:\tmp\client.exe" -Algorithm MD5) | Format-Wide) -Property Hash)
Set-Variable -Name "checkjs" -Value (Get-FileHash -Path "C:\tmp\client.js" -Algorithm MD5) |  Format-Wide -Property Hash)
$md5check = $checkexe + "_" + $checkjs
#Prüfen (nur zum testen) output falsch
$md5check

Würde ich für die Varible 

$md5check

einen korrekten output bekommen, könnte ich vergleichen...Aber ich weiß nicht wie ich an die Werte komme.

Wie gesagt, ich bin neu in der materie...und freu mich auf hilfe...Danke


Get-MailBoxPermission - Objekte filtern und dann einzeln über Schleifenkonstrukt ergänzen

$
0
0

Hallo zusammen,

ich benötige noch etwas Hilfe beim Fertigstellen meines PowerShell-Skriptes:

Nachfolgender Codeblock übernähme die Aufgabe, alle Berechtigungen an einem Postfach wegzunehmen. Dazu lese ich aus, wer aktuell Zugriff hat per Get-MailBoxPermission. Die Objekte, die mit dem Kürzel BYMUC\ unter "Users" beginnen sind diejenigen, die hernach die Berechtigungen verlieren sollen. 

1) Ich weiß jetzt nicht, wie ich korrekt Objekte mit dem Kürzel herausfiltere. Dabei benötige ich nur die Zeichenkette hinter dem Kürzel BYMUC\, bspw. BYMUC\HuberAlois, also nur den HuberAlois.

2) Der unter 2) stehende Befehl kann die Objekte nur verarbeiten, wenn ein Präfix der Form bymuc- vorangestellt wird, bspw. bymuc-HuberAlois, weswegen ich den bei 2) stehenden Befehl so aufbauen muss/möchte. 

Vielen Dank für eure Hilfe! :)

Nachtrag: Das Präfix ist immer feststehend! Also es bleibt immer bymuc!

$mitgliederExchange =@()

$postfachobjekt = get-host "Eingabe:"

# 1) $mitgliederExchange = Get-MailBoxPermission -Identitiy $postfachobjekt -User -Name -like "BYMUC\" # 1) $mitgliederExchange = Get-MailBoxPermission -Identitiy $postfachobjekt | Where{$_.user -like "BYMUC\*" } foreach ($mitglied in $mitgliederExchange) { # 2) $nutzerName = "bymuc-" + $mitglied # Wichtige Konkatenation für den Exchange-Dienst

Remove-MailboxPermission -Identity $postfachobjekt -User $nutzerName -AccessRights FullAccess -InheritanceType All -Confirm:$false Remove-ADPermission -Identity $postfachobjekt -User $nutzerName -ExtendedRight Send-As -InheritanceType All -Confirm:$false }






PS Forms - Laufenden Prozess ueber Cancel-Button beenden

$
0
0

Hallo,

ich habe eine kleine GUI gebastelt.

Die GUI enthält einen Copy und einen Cancel Button.

Durch "Klick" auf den Button Copy sollen logischerweise Daten kopiert werden.

Durch "Klick" auf den Button Cancel, soll der Kopiervorgang ggf. abgebrochen werden können.

Jetzt ist es ja so, dass während des Kopiervorganges die GUI eingefroren ist und der Cancel-Button

gar nicht betätigt werden kann bzw. keine Funktion hat.

Ich habe durch recherchieren öfters den Hinweis auf Multithreading, Runspaces und Jobs gefunden, allerdings

sahen mir die Beispiele meistens so aus, als wenn ich sie für die Lösung meines Problems nicht wirklich

gebrauchen könnte bzw. wüsste ich nicht, wie ich es sinnvoll anwenden könnte.

Hat jemand vielleicht einen Beispielcode oder Codeschnipsel, der meine beschriebene Problematik löst bzw. ansehnlicher

veranschaulicht. Ich erwarte keinen fertigen Code, aber vielleicht einen Ansatz in die richtige Richtung. Bitte keine

Schlagwörter wie Runspaces, Jobs oder Multithreading, denn das hat mich bisher leider auch noch nicht weiter gebracht.

Vielen Dank im voraus!

Habe den Code mal mit angehängt:

clear
# Load Assemblies
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null

# Init Form
$Form = New-Object System.Windows.Forms.Form
$Form.width = 400
$Form.height = 600
$Form.Backcolor=“white“
$Form.Text = "Test"

# Init ProgressBar
$pbrTest = New-Object System.Windows.Forms.ProgressBar
$pbrTest.Maximum = 100
$pbrTest.Minimum = 0
$pbrTest.Location = new-object System.Drawing.Size(10,10)
$pbrTest.size = new-object System.Drawing.Size(200,50)
$i = 0
$Form.Controls.Add($pbrTest)

# Button
$btnConfirm = new-object System.Windows.Forms.Button
$btnConfirm.Location = new-object System.Drawing.Size(250,10)
$btnConfirm.Size = new-object System.Drawing.Size(100,30)
$btnConfirm.Text = "Start Progress"
$Form.Controls.Add($btnConfirm)


### Cancel
$ButtonCancel = New-Object System.Windows.Forms.Button
$ButtonCancel.Location = New-Object System.Drawing.Size(250,50)
$ButtonCancel.Size = New-Object System.Drawing.Size(100,30)
$ButtonCancel.Font = New-Object System.Drawing.Font("Consolas", 8 ,[System.Drawing.FontStyle]::Bold)
$ButtonCancel.BackColor = [System.Drawing.Color]::Red
$ButtonCancel.ForeColor = [System.Drawing.Color]::Yellow
$ButtonCancel.Add_MouseHover({$ButtonCancel.backcolor = [System.Drawing.Color]::Green})
$ButtonCancel.Add_MouseLeave({$ButtonCancel.backcolor = [System.Drawing.Color]::Red})
$ButtonCancel.Text = "Cancel"
$ButtonCancel.Add_Click({
  Write-Host "BREAK !!!"
})
$Form.Controls.Add($ButtonCancel)

### Output box
$LabelOutput = New-Object System.Windows.Forms.Label
$LabelOutput.Location = New-Object System.Drawing.Size(10,90)
$LabelOutput.Size = New-Object System.Drawing.Size(80,25)
$LabelOutput.Font = New-Object System.Drawing.Font("Consolas", 8 ,[System.Drawing.FontStyle]::Bold)
$LabelOutput.ForeColor = [System.Drawing.Color]::Green
$LabelOutput.Text = "Result(s): "
$Form.Controls.Add($LabelOutput)

$outputBox = New-Object System.Windows.Forms.TextBox
$outputBox.Location = New-Object System.Drawing.Size(10,115)
$outputBox.Size = New-Object System.Drawing.Size(350,400)
$outputBox.MultiLine = $True
$outputBox.ScrollBars = "Vertical"
$Form.Controls.Add($outputBox)

################################################################################
###                                  Statusbar                                    
################################################################################
$statusBar1 = New-Object System.Windows.Forms.StatusBar
$statusBar1.Name = "statusBar1"
$statusBar1.Text = "Status: ... Waiting ..."
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 284
$System_Drawing_Size.Height = 22
$statusBar1.Size = $System_Drawing_Size
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 0
$System_Drawing_Point.Y = 240
$statusBar1.Font = New-Object System.Drawing.Font("Consolas", 8 ,[System.Drawing.FontStyle]::Bold)
$statusBar1.Location = $System_Drawing_Point
$statusBar1.DataBindings.DefaultDataSourceUpdateMode = 0
$statusBar1.TabIndex = 1
$Form.Controls.Add($statusBar1)


# Button Click Event to Run ProgressBar
$dest_path = "C:\TEST1
$data_path = "C:\TEST2
$robo_log = "C:\TEST\robo.log"

$top_dirs = Get-ChildItem -Path $data_path -Directory
$top_dirs = $top_dirs.Name


$btnConfirm.Add_Click({
  $i=0

  foreach ($folder in $top_dirs) {

    Write-Host "folder: $($folder)"

    ### calculate percentage
    $i++
    $pbrTest.Value = ($i/$top_dirs.count)*100
    ### update the progress bar
    Start-Sleep -m 1

    $folder_content = (gci -recurse $data_path\$folder)
#    $folder_content = $folder_content.Name
    Write-Host "folder_content: $folder_content"

    robocopy $data_path\$folder $dest_path\$folder /s /ndl /njh /njs /np /ns /nc /mir /log:$robo_log

    $robo_log_content = Get-Content "$robo_log"


    foreach ($log_entry in $robo_log_content){
      $outputBox.AppendText("$($log_entry) `r`n")
    }

    ### show folder_content in outputBox
#    $outputBox.AppendText("$($folder_content) `r`n")
  }
})<#
$btnConfirm.Add_Click({
  While ($i -le 100) {
    Write-Host "i: $($i)"

    $pbrTest.Value = $i
    Start-Sleep -m 1
    "VALLUE EQ"
    $i
    $i += 1

    robocopy $data_path\$folder $dest_path\$folder /s /ndl /njh /njs /np /ns /nc /mir /Tee

  }
})
#>

# Show Form
$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()


Abfrage $Shell.windows() aller lokaler Benutzer

$
0
0

Hallo zusammen,

ich bin neu im Thema PowerShell unterwegs und baue zurzeit ein Skript, um den Internet Explorer als "anderen Benutzer" auszuführen. Danach soll per PowerShell der IE gesteuert werden. Die Erstellung der Benutzer funktioniert, und auch das Starten des IE unter einem anderen Benutzerkontext läuft reibungslos. Steuerung des IE klappt ebenfalls

Mittels folgenden Zeilen fange ich die offenen Fenster des IE ab. 

$Shell = New-Object -Com Shell.Application
$Application = $Shell.Windows()

Und hier liegt mein Problem: Mir werden nur lediglich die Sessions des eingeloggten Benutzers angezeigt, nicht die der anderen lokalen Benutzers. Somit ist es mir nur Möglich diese eine IE Session anzusteuern, statt auch die anderen.

Ich habe versucht PowerShell ebenfalls unter einem anderen Benutzerkontext auszuführen und dort die obigen Zeilen auszuführen, wobei ich jedoch Berechtigungs-Fehler erhalte, sobald ich $Shell.Windows() absetze. (Administrator-Rechte wurden aber vergeben)

Gibt es eine Möglichkeit sich die offenen IE Prozesse aller Benutzer anzeigen und ansteuern zu lassen?

Über Denkanstöße wäre ich sehr dankbar!

vielen Dank und mit besten Grüßen

Steven

XML-Element an bestimmter Stelle einfügen

$
0
0

Moin, moin.

Bin XML-Neuling und brauch Hilfe. Ich würde gern einen XML-Node an einer bestimmten Stelle einfügen. Mit appendChild bekomme ich das über den Pfad immer nur an die letzte Position. Ich möchte aber an ein Element mit bestimmten Atribut einfügen.

XML-Dokument:

<ROOT><REGIONS><FIELD NAME="foo"><VALUE><TEXT>abcdef</TEXT></VALUE></FIELD><FIELD NAME="bar"><VALUE><TEXT>abcdef</TEXT></VALUE></FIELD></REGIONS></ROOT>

Ich würde gern ein neues Element "FIELD" nach FIELD NAME  ="foo" einfügen.

Würde mich über einen Tipp sehr freuen.

Danke und Gruß

Martin


Im Datei-Explorer angepinnte Verzeichnisse werden in PowerShell geöffnet

$
0
0

Seit der Installation von PowerShell 6 auf einem unserer Server werden die am Datei-Explorer in der Tastleiste angepinnten Verzeichnisse mit einem PowerShell-Fenster geöffnet anstatt mit dem Datei-Explorer.

Meine schon mehrere Tage andauernde Suche (Google, Bing, Duckduckgo, etc.)  nach eine Lösung zur Wiederherstellung der richtigen Zuordnung ist leider erfolglos.

Auch meine Kollegen wissen keinen Rat und sind der Meinung, dass das so sein soll, was ich mir aber nicht vorstellen kann.

Ist das wirklich so? Oder kann ich die angepinnten Verzeichnisse wieder mit dem Explorer verknüpfen? Und wenn ja, wie?

Wer Informationen zu diesem Thema hat, möge sie doch gerne mit mir teilen.

Vielen Dank und liebe Grüße

kleo-patra

Testing - Pester

$
0
0

Hallo,

ich bin noch sehr neu was Testing in Powershell bzw allgemein Testing anbelangt. Habe es mal bisschen in Java gemacht.

Nun möchte mein Betreuer(bin Praktikant)l, dass ich in meinem Skript Testing einbaue. Ist zwar die falsche Heransgehenweise, aber ist jetzt auch egal.

Man testet ja zumindest in Java die Klassen und die Methoden/Funktionen. Jetzt mal der Code (der lange Codeblock in der Mitte) in etwas älterer Form, der bereits durch das Forum geistert und ich wäre sehr erfreut, wenn einer mir sagen könnte, was man gut testen könnte. Damit ich besser mit meinem Betreuer reden kann.

Meiner Meinung nach kann man nur die get-Keystate Funktion (wie teste ich einen Tastendruck), die checkBrowserState und isFullscreen (auch da wie soll sowas getestet werden?).

PS: Pester Version 3.4.0 - fragt nicht warum. Ist leider so.

Vielen Dank.

mfg werdas34

Verzeichnisse vergleichen klappt nicht

$
0
0

Guten Tag zsuammen

Ich muss mich an euch Spezialisten wenden. Ich versuche zwei Verzeichnisse mit Unterordner zu vergleichen.

Mit folgendem Befehl:

compare (gci -r 'O:\XXX\XY\KKKKK\KKKK22\71-yyyy.zzz Crrr') (gci -r '\\Vf0010\es$\os\\XXXX\XY\KKKKK\KKKK22\71-yyyy.zzz Crrr')

Wenn ich den nun laufen lasse, dann bekomme ich Fehlermeldungen gci : Ein Teil des Pfades konnte nicht gefunden werden. dAs heisst es handelt sich um Unterordner die ebenfalls Leerzeichen im Namen haben.

Wie kann ich das  umgehen das er mir auch die ausliest?

Besten dank und Gruss

Roger


Powershell: Ordner mit Filechooser auswählen

$
0
0

In einem größerem Skript brauche ich einen Dialog, um ein Verzeichnis auszuwählen. Mit dem Folderchooser war das kein großes Problem. Ich mag jedoch diesen Dialog nicht und würde lieber den Filechooser verwenden. Dafür habe ich bei Github ein Skript gefunden:
https://gist.github.com/IMJLA/1d570aa2bb5c30215c222e7a5e5078fd
Für sich allein funktioniert dieses einwandfrei. Ich hatte jedoch Probleme, es mit meinem bisherigen Skript zusammenzubringen. Mit viel Bastelei habe ich dann dieses zum Laufen gebracht:

# Filechooser vorbereiten, dies ist von Github uebernommen
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$AssemblyFullName = 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
$Assembly = [System.Reflection.Assembly]::Load($AssemblyFullName)
$OpenFileDialog = [System.Windows.Forms.OpenFileDialog]::new()
$OpenFileDialog.AddExtension = $false
$OpenFileDialog.CheckFileExists = $false
$OpenFileDialog.DereferenceLinks = $true
$OpenFileDialog.Filter = "Folders|`n"
$OpenFileDialog.Multiselect = $false
$OpenFileDialog.Title = "Select folder"
$OpenFileDialogType = $OpenFileDialog.GetType()
$FileDialogInterfaceType = $Assembly.GetType('System.Windows.Forms.FileDialogNative+IFileDialog')
$IFileDialog = $OpenFileDialogType.GetMethod('CreateVistaDialog', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($OpenFileDialog, $null)
$OpenFileDialogType.GetMethod('OnBeforeVistaDialog', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($OpenFileDialog, $IFileDialog)
[uint32]$PickFoldersOption = $Assembly.GetType('System.Windows.Forms.FileDialogNative+FOS').GetField('FOS_PICKFOLDERS').GetValue($null)
$FolderOptions = $OpenFileDialogType.GetMethod('get_Options', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($OpenFileDialog, $null) -bor $PickFoldersOption
$FileDialogInterfaceType.GetMethod('SetOptions', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($IFileDialog, $FolderOptions)
$VistaDialogEvent = [System.Activator]::CreateInstance($AssemblyFullName, 'System.Windows.Forms.FileDialog+VistaDialogEvents', $false, 0, $null, $OpenFileDialog, $null, $null).Unwrap()
[uint32]$AdviceCookie = 0
$AdvisoryParameters = @($VistaDialogEvent, $AdviceCookie)
$AdviseResult = $FileDialogInterfaceType.GetMethod('Advise', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($IFileDialog, $AdvisoryParameters)
$AdviceCookie = $AdvisoryParameters[1]
# Ende von Github uebernommen

# So habe ich es bisher gemacht:
$objForm = New-Object System.Windows.Forms.Form
[System.Windows.Forms.Application]::EnableVisualStyles()
$objForm.Size = New-Object System.Drawing.Size(800, 500)
$folderChooseBtn = New-Object System.Windows.Forms.Button
$folderChooseBtn.Location = New-Object System.Drawing.Size($x, $y)
$folderChooseBtn.Size = New-Object System.Drawing.Size(100, 20)
$folderChooseBtn.Text = "Ordner wählen"
$folderChooseBtn.Name = "Ordnerwahl"
$folderChooseBtn.Add_Click( {
        # Oeffnen des Filechoosers, von Github uebernommen
        $Result = $FileDialogInterfaceType.GetMethod('Show', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($IFileDialog, [System.IntPtr]::Zero)
        $FileDialogInterfaceType.GetMethod('Unadvise', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($IFileDialog, $AdviceCookie)
        if ($Result -eq [System.Windows.Forms.DialogResult]::OK) {
            $FileDialogInterfaceType.GetMethod('GetResult', @('NonPublic', 'Public', 'Static', 'Instance')).Invoke($IFileDialog, $null)
        }
        Write-Host $OpenFileDialog.FileName
        # Ende von Github uebenommen
    })
$objForm.Controls.Add($folderChooseBtn)
[void] $objForm.ShowDialog()

Read-Host -Prompt "Press Enter to exit"

Ich habe das dumpfe Gefühl, dass die Art und Weise, wie ich beides vermengt habe, nicht so optimal ist und bitte um Durchsicht und Verbesserungsvorschläge.

Edit: Wie man wahrscheinlich an dem Code schon sieht, stehe ich noch ganz am Anfang mit Powershell. Bin jedoch schon mal sehr angetan davon: Man kann ein GUI machen und auf das Netz zugreifen.


Aufbau einer Remote Verbindung mit Enter-PSSession nicht möglich

$
0
0

Hallo,

ich versuche eine remoteverbindung mit dem Befehl.. aufzubauen. Verbindung ist von Win10 zu WIN 7.  Die Verbindung von win10 zu win 10 funktioniert einwandfrei.

  • Enter-PSSession REMOTE1 -Credential domainnamel

Es wird ein Fehler angezeigt.

Beim Verbinden mit dem Remoteserver "Remote1" ist folgender Fehler aufgetreten: Der WinRM-Client kann die Anforderung nicht verarbeiten. Der  Inhaltstyp der HTTP-Antwort vom Weitere Informationen finden Sie im Hilfethema "about_Remote_Troubleshooting".

Danke

WPF Runspaces and shared variables

$
0
0

Hi there,

i have a problem with shared variables in runspaces with wpf forms.

I habe a wpf form with a button and a listbox. On the listbox i have a menuitem to export the results from the listbox.
When i click on the button i start a runspace, that gets some information (in the example i just do a get-service) and writes them to the listbox.
To have the possiblity to do an export of the items in the list box with all of the attributes i want to write the results of the command (get-service) to a shared variable that i can use in the wpf form later.
How it should work:

- Click Button
--> Start Runspace and call get-service (Search Button and Export-csv will be set to isenabled=false)
--> Write the results to a shared variable
--> Add the results to the listbox within the runspace
--> When runspace finished set search Button and Export-csv to isenabled=true
- Click ExportCSV
--> export the results from the shared variable with all attributes

Within the runspace i can see that the variable is filled correctly and i can add the results to the listbox or a text field in the wpf gui. The problem is, that when i try to use the shared variable outside the runspace it is empty.

If i do a similar thing without wpf gui the sharedvariable is accesible from my powershell session but wpf it wont work.

I am really stuck here and don't get a way to manage it. Can you please provide some help/ideas how to do it.

The global variable handle just was for testing issues.

Thanks in advance.

Regards,

Tom

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
#region Load XAML
[xml]$script:XAMLTest = @"<Window x:Class="Test.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Test"
        mc:Ignorable="d"
        Title="Test" Height="479.303" Width="320.697" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Background="White"><Grid Margin="0,1,2,-1" Background="#FFF0F0F0"><Button x:Name="btn_search" Content="Search" HorizontalAlignment="Left" Margin="111,204,0,0" VerticalAlignment="Top" Width="75" FontSize="12" RenderTransformOrigin="3.108,9.031"/><ListBox x:Name="lst_search" HorizontalAlignment="Left" Height="189" Margin="27,10,0,0" VerticalAlignment="Top" Width="269"><ListBox.ContextMenu><ContextMenu AllowDrop="True"><MenuItem x:Name="lmi_exportcsv" Header="Export to CSV" IsEnabled="True"/></ContextMenu></ListBox.ContextMenu></ListBox><TextBox x:Name="txt_message" HorizontalAlignment="Left" Height="155" Margin="10,270,0,0" TextWrapping="NoWrap" VerticalAlignment="Top" Width="286" IsReadOnly="True" Background="#FFF0F0F0" VerticalScrollBarVisibility="Auto"/></Grid></Window>"@ -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^<Win.*', '<Window'
#region Load Form
try {
    $TestForm = [Windows.Markup.XamlReader]::Load( (New-Object System.Xml.XmlNodeReader $XAMLTest) )
}
catch {
    Write-Host "Cannot load Windows.Markup.XamlReader"
}
$XAMLTest.SelectNodes("//*[@Name]") | ForEach-Object {Set-Variable -Name ($_.Name) -Value $TestForm.FindName($_.Name)}
#endregion Load Form
#region variables
$services   = @()
$script:sharedData = [HashTable]::Synchronized(@{})
#endregion variables
#region functions
function Invoke-ServiceSearch{
    [CmdletBinding()]
    param (
    [parameter(Position=0,
      Mandatory=$false)]
      $Testform,
    [parameter(Position=1,
      Mandatory=$false)]
      $lst_search,
    [parameter(Position=2,
      Mandatory=$false)]
      $btn_search,
    [parameter(Position=3,
      Mandatory=$false)]
      $txt_message,
      [parameter(Position=4,
      Mandatory=$false)]
      $lmi_exportcsv,
      [parameter(Position=5,
      Mandatory=$false)]
      $services
    )

    $code = {
        $shareddata.services = Get-Service
        $sharedData.testform.Dispatcher.invoke([action]{$null = $sharedData.lst_search.ItemsSource = $sharedData.services},'Normal')
        $sharedData.testform.Dispatcher.invoke([action]{$null = $sharedData.txt_message.AppendText("Runspace: $($Shareddata.services.Name)")})
        #$sharedData.testform.Dispatcher.invoke([action]{$null = $sharedData.lmi_exportcsv.IsEnabled="True"})
    }
    #region adding variables for use in new runspace
    $shareddata = @{
        testform                    = $testform
        lst_search                  = $lst_search
        btn_search                  = $btn_search
        txt_message                 = $txt_message
        services                    = $services
        error                       = $error
    }
#endregion adding variables

#generate a new runspace
    $runspace = [RunSpaceFactory]::CreateRunspace()
    $runspace.ApartmentState = 'STA'
    $runspace.ThreadOptions = 'ReuseThread'
    $runspace.Open()

    #add shared variable to runspace
    $runspace.SessionStateProxy.setVariable("sharedData", $sharedData)
    #generate a new psthread and add script code
    $ps             = [PowerShell]::Create().AddScript($code)
    $ps.Runspace    = $runspace
    $global:handle  = $ps.BeginInvoke()
}
#endregion functions
$btn_search.Add_Click{
    $SearchParams = @{
        testform                = $TestForm
        btn_search              = $btn_search
        lst_search              = $lst_search
        txt_message             = $txt_message
        lmi_exportcsv           = $lmi_exportcsv
        services                = $services
    }
    Invoke-ServiceSearch @SearchParams
}
$lmi_exportcsv.Add_Click{
    $txt_message.AppendText("`nMain: $($shareddata.services.Name)")
}
$null = $TestForm.ShowDialog()

PS Script nur auf Server ausführbar

$
0
0

Moin

Ich habe einen PS Script geschrieben der über VPN auf eine DB Mysql zugreift und Daten ausliest, auf dem Server funktioniert dies. ( die Datei liegt auch auf dem Server und soll von da aufgerufen werden )

Rufe ich die Script Datei von einen Clienten übers Netzwerk auf , bekomme ich immer diese Fehler.

\\rma\ActivateOS\activate.ps1 : System.Management.Automation.MethodInvocationException: Ausnahme beim Aufrufen von
"Open" mit 0 Argument(en):  "Unable to connect to any of the specified MySQL hosts." --->
MySql.Data.MySqlClient.MySqlException: Unable to connect to any of the specified MySQL hosts. --->
MySql.Data.MySqlClient.MySqlException: Timeout expired.  The timeout period elapsed prior to completion of the
operation or the server is not responding.
   bei MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings)
   bei MySql.Data.MySqlClient.NativeDriver.Open()
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei MySql.Data.MySqlClient.NativeDriver.Open()
   bei MySql.Data.MySqlClient.Driver.Open()
   bei MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
   bei MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
   bei MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
   bei MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
   bei MySql.Data.MySqlClient.MySqlPool.GetConnection()
   bei MySql.Data.MySqlClient.MySqlConnection.Open()
   bei CallSite.Target(Closure , CallSite , Object )
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception
exception)
   bei System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame)
   bei System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
   bei System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
In Zeile:1 Zeichen:91
+ ... tionPolicy -Scope Process Bypass }; & '\\rma\ActivateOS\activate.ps1'
+                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,activate.ps1

vom Server aufgerufen funktioniert dies :

PS D:\ActivateOS> D:\ActivateOS\activate.ps1
Bitte geben Sie die Kundenbestellnummer ein!: 123456
Aktivierung mit Windows-Key NXXXX-RXXXX-HXXXX-GXXXX-8XXXX von Kunde : 123456
Ihre Windows Version wurde aktiviert

Warum funktioniert dies von den Clients übers Netzwerk nicht???

MFG


Auslesen der Pfade die aktuell im Windows Explorer geöffnet sind, diese zwischenspeichern und später wieder öffen (ohne Admin-Rechte)

$
0
0

Hallo Gemeinschaft.

Inzwischen habe ich bestimmt schon einen Tag gesucht und stoße nur auf entweder vollkommen irrelevantes oder in anderen Skript-Sprachen die Installationen oder Admin-Rechte fordern - beides DARF jedoch nicht nötig sein!

Wie der Titel schon aussagt, möchte ich die Im Explorer (oder auch weiteren Programme) geöffneten Pfade bzw. Dateien zwischenspeichern und diese dann nach einem Neustart des Rechners manuell, zeitverzögert oder an ein event gebunden wieder starten.

Da es üblich ist, dass man immer hinterfragt wird, hier der Grund:

Auf meinen Firmen-Notebook verliere ich die Explorer-Fenster, wenn ich mich per VPN anmelde, da die VPN-Verbindung leider erst nach dem Anmelden erfolgt.
Ergo - Bei Anmeldung existieren nur die lokalen Pfade und somit findet Windows die Netzwerkpfade nicht.

Nun möchte ich quasi diesem Problem entgegnen, indem ich die Pfade der geöffneten (ich habe immer viele auf) speichere und NACH dem VPN-Aufbau wiederherstelle/öffne.

Wäre super, wenn hier jemand eine Lösung oder wenigstens richtweisende Code-Schnipsel für mich PowerShell-Laien hätte. ;)

Danke!


Viewing all 2314 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>