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

get-localgroupmember, where klause mit länge einschränken

$
0
0

kann man in einer where Klausel auch gleich nach länge einschränken?

get-localgroupmember administrators | where (name).length -eq 12


Chris


PowerShell [XAML/WPF]- Zugriff auf synchronized Hashtable in Runspace

$
0
0

Hallo,

ich habe eine kleine WPF-GUI mit einem Textfeld durch XAML-Code erstellt.
Das Textfeld speicher ich in einer synchronisierten Hashtabelle.

Um Aufgaben Asyncron erledigen zu können, habe ich eine Funktion "Execute-Async" geschrieben.
Der Funktion kann ein Scriptblock übergeben werden, wobei der Scriptblock dann in einem neuem Runspace ausgeführt wird.

Mein Problem ist nun, dass ich in dem asynchronem Scriptblock nicht das Textfeld aus der synchronisierten Hashtabelle auslesen kann (z.B. den Text).
Allerdings kann ich in dem asynchronem Scriptblock dem Textfeld einen neuen Wert geben.

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
$sync = [Hashtable]::Synchronized(@{ })
$sync.host = $Host

# =========================================================================== #
# = XAML GUI                                                                = #
# =========================================================================== #
[xml]$XAML = @'
<Window
    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"
    Height="300" Width="400" WindowStartupLocation="CenterScreen"><Grid Margin="0,0,-0.4,5.4"><Grid Height="147" Margin="10,18,9.6,0" VerticalAlignment="Top"><Grid.ColumnDefinitions><ColumnDefinition Width="258*"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition Height="60*"/></Grid.RowDefinitions><TextBox x:Name="main_textbox_Counter" Height="22" Margin="10,34,15.4,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" BorderBrush="Black" Foreground="Black"/></Grid></Grid></Window>
'@
$XAML.Window.RemoveAttribute('x:Class')
$XAML.Window.RemoveAttribute('mc:Ignorable')
$XAMLReader = New-Object System.Xml.XmlNodeReader $XAML
try{
  $Form=[Windows.Markup.XamlReader]::Load( $XAMLReader )
}
catch{
  Write-Host "Windows.Markup.XamlReader konnte nicht geladen werden. Mögliche Ursache: ungültige Syntax oder fehlendes .net"
}
$sync.Form = $Form

# =========================================================================== #
# = Connect to Controls                                                     = #
# =========================================================================== #
$sync.main_textbox_Counter = $Form.FindName('main_textbox_Counter')

# =========================================================================== #
# = Asynchrones ausführen                                                   = #
# =========================================================================== #
function Execute-Async {
    param (
        [scriptblock] $ScriptBlock,
        [psobject] $Self = @{ },
        [string] $Name = ""
    )
    Write-host "Starte neuen Runspace für Action [$Name]."
    $rs = [runspacefactory]::CreateRunspace()
    $rs.ApartmentState = "STA"
    $rs.ThreadOptions = "ReuseThread"
    $rs.Open()
    $rs.SessionStateProxy.SetVariable("sync", $sync)
    foreach ($var in $Variables.Keys) {
        if ($var -ine 'host') {
            $rs.SessionStateProxy.SetVariable($var, $Variables[$var])
        }
    }
    $script = [PowerShell]::Create()
    [void]$script.AddScript($ScriptBlock)
    $script.Runspace = $rs
    $script.BeginInvoke()
}

# =========================================================================== #
# = Eingeschränkter Zugriff auf Textfeld in Asynchronem Scriptblock         = #
# =========================================================================== #
Execute-Async -Name "Test Schleife" -ScriptBlock {
  for ($i=1; $i -le 10; $i++) {
    if(-not ( $sync.ende)){
      # Textfeld Wert setzen über sync funktioniert
      $sync.Form.Dispatcher.invoke([action]{
        $sync.main_textbox_Counter.Text = $i
      })

      # Ausgabe auf Konsole über sync funktioniert
      $sync.host.UI.WriteLine("[Counter] ... $i")

      # Textfeld auslesen über sync funktioniert nicht...
      $sync.host.UI.WriteErrorLine("[Textbox] ... " + $sync.main_textbox_computername.Text)
    }
    else{
      exit
    }
    Start-Sleep -Milliseconds 1000
  }
}

$sync.main_textbox_Counter.Focus()
[void]$sync.Form.Dispatcher.InvokeAsync{$sync.Form.ShowDialog()}.Wait()
$sync.ende = $true

Bestimmte Zeilen aus Datei in CSV schreiben

$
0
0

Hallo,

ich bin absoluter Neuling in Powershell, habe aber auf Arbeit eine Aufgabe bekommen in die ich mich selber reinfuchsen soll.

Und zwar soll ich 3 Zeilen aus einer Bitlocker Sicherungsdatei auslesen und als CSV speichern. Dabei soll davor noch aus dem Dateiname der Computername gespeichert werden.

Ich bin schon soweit das ich, wenn ich eine bestimmte Datei in diesem Ordner angebe genau die Zeilen ausgegeben bekomme die ich möchte. Wie ich das allerdings mache das es für alle Dateien in dem Ordner funktioniert weiß ich noch nicht.

Allgemein fehlt mir irgendwie der Ansatz wie ich das ganze angehen soll.

Kann mir da irgendwer helfen?

Gruß

Fabiii

Get-ADUser mit multiple Filter (funktioniert und funktioniert nicht)

$
0
0

Hallo Leute,

Ich habe da ein merkwürdiges Problem und weiß grad nicht mehr weiter...

Get-ADUser mit zwei mal -ne  funktioniert!

Get-ADUser mit zwei mal -eq oder -like funktioniert nicht!

Hier mein Beispiel:

FUNKTIONIERT: Ich bekomme eine Ausgabe

Get-ADUser -filter {state -ne "non-Personal-Account" -and state -ne "disabled"} -Properties * | select Name

FUNKTIONIERT NICHT: Ich bekomme keine Ausgabe

Get-ADUser -filter {state -eq "non-Personal-Account" -and state -eq "disabled"} -Properties * | select Name

FUNKTIONIERT NICHT: Ich bekomme keine Ausgabe

Get-ADUser -filter {state -like "non-Personal-Account" -and state -like "disabled"} -Properties * | select Name

Was ist da los?

Danke für eure Hilfe :-)

Invoke-Command Function switch param in ArgumentList

$
0
0
Hi zusammen,
ich habe folgendes Problem...

Ich möchte an eine remote auszuführende Funktion in der ArgumentList einen von mehreren switch Parametern übergeben.
Wie muss ich das machen?
Bei nur einem switch parameter komme ich mit $true weiter, aber nicht bei mehreren an Position=0.

Gruß und danke in Vorraus...
# hier die function
function myFN {
    [cmdletBinding()]

    param
    (
        [Parameter(ParameterSetName="EditMode_add",    Position=0,Mandatory=$true)]
        [Switch]$EditMode_add,

        [Parameter(ParameterSetName="EditMode_delete", Position=0,Mandatory=$true)]
        [Switch]$EditMode_delete,

        [Parameter(ParameterSetName="EditMode_add",    Position=1,Mandatory=$true)]
        [Parameter(ParameterSetName="EditMode_delete", Position=1,Mandatory=$true)]
        [String]$param1
    )

    
}

# ausführung (funktioniert nicht weil nicht definiert ist, welcher switch param gemeint ist)
Invoke-Command -Session $PSSessionID -ScriptBlock ${Function:myFN} -ArgumentList ($true,"param1")

# ausführung (funktioniert auch nicht)
Invoke-Command -Session $PSSessionID -ScriptBlock ${Function:myFN} -ArgumentList ($EditMode_add=$true,"param1")



New-AdUser - Aufgabenplanung - Kein Zugriff - Subdomain

$
0
0

Guten Tag,

ich habe gerade ein nicht ganz nachvollziehbares Rechteproblem mit der Powershell.

In meiner Struktur habe ich eine Domäne mit einer Subdomäne. In beiden Domänen lasse ich eine Aufgabe laufen über Powershell die den Befehl hat "New-ADUser". Die Aufgabenplanung ist geplant über Programm:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

und der dazugehörigen Argumente das Powershellscript selbst: -command "C:\Powershell\NewADUser.ps1".

Dazu ist eingestellt "Unabhängig von der Benutzeranmeldung ausführen" und "Mit den höchsten Privilegien ausführen". Der Benutzer und das Kennwort sind ebenfalls gespeichert.

Was mich nun zum verzweifeln bringt ist, dass in der Hauptdomain das ohne Probleme klappt und in der Subdomain kommt bei dem Befehl immmer "Zugriff verweigert". Hinterlegt zum Test, habe ich sogar nun bereits den Administrator der Subdomain.

Habe ich irgendwo noch Rechte zu setzen?

Daten aus Ordner Struktur und "Index" Datei löschen

$
0
0

Hallo Zusammen


Ich habe ein Problem mit dem Schreiben einer Batch Datei (vlt. währe Powershell auch besser) die alte Daten löscht. Sprich den Teil habe ich eigentlich schon:

forfiles /p P:\test\ar1047 /s /m *_* /d -2000 /c “cmd /c IF @isDir EQU FALSE (del /Q /F @path) & cmd /c echo @path;@file;@fdate>> P:\u\ar\deleted.log & cmd /c echo @path          @file          @fdate”

Das ganze ist eine ziemlich grosse Ordnerstruktur die so bleiben muss, das funktioniert mit dem löschen so auch. Ich habe einen Ordner "ar" in diesem befinden sich die Ordner "ar0001" - "ar1052" und in jedem dieser Ordner sind noch einmal 16 Unterordner und in diesen befinden sich die zu löschenden Dateien.

Das Problem ist das die gelöschten Daten noch in einer Datei mit dem Name "ARCHIV" stehen und diese Datei gibt es in mehrerer Unterordner (für die Daten im jeweiligen Unterordner) des Pfades den ich mit forfiles aufräume. 

Ich schreibe die Daten in ein Log file also habe ich mir gedacht ich kann diese Information doch weiter nutzen um in den "ARCHIV" Dateien die entsprechende Zeile zu suchen und zu löschen.

Das Log sieht zur Zeit so aus:

"P:\test\ar1111\1236789_05.txt";"1236789_05.txt";19.06.2019 
"P:\test\ar1111\123678_03.txt";"123678_03.txt";19.06.2019 
"P:\test\ar1111\12367_02.txt";"12367_02.txt";19.06.2019 
"P:\test\ar1111\1236_01.txt";"1236_01.txt";19.06.2019  

Die "ARCHIV" DATEI sieht so aus:

 VERSION 3.00
PART_NAME;MACHINE_NO;MACHINE_NAME;MATERIAL_NO;MATERIAL_NAME;DIMENSION_X;DIMENSION_Y;DIMENSION_Z;HEADER_LINE_01;HEADER_LINE_02;HEADER_LINE_03;HEADER_LINE_04;HEADER_LINE_05;HEADER_LINE_06;HEADER_LINE_07;HEADER_LINE_08;HEADER_LINE_09;HEADER_LINE_10;HEADER_LINE_11;HEADER_LINE_12;HEADER_LINE_13;HEADER_LINE_14;HEADER_LINE_15;HEADER_LINE_16;HEADER_LINE_17;HEADER_LINE_18;HEADER_LINE_19;PART_AREA;PART_AREA_CN;PART_WEIGHT;PART_WGHT_CN;PART_COST_MAIN_TIME;SDATE;STIME;"236749_001_02(M2)";2;"Salvagnini S4";19;"DX51D+ZF100R";2317.000;272.000;1.400;;"TYP1_01_STL_S4";"TYP1_01_STL_S4";"COD";;"DX51D+ZF100R";"KOPFNUMMER_060";"23674912";"236749_001_02";"21.01.2013";"ScRa";"WEMO";"SALVA S4-P4";;;;;;"W  57";614792.500;618075.625;6.7566;6.7927;1.3324;"22.02.2019";"16:08:38";"236749_001_02";1;"TC 5000 R 1600 FMC";19;"DX51D+ZF100R";2317.000;272.500;1.400;;"TYP_1_01_ST";"TYP_1_01_ST";;;"DX51D+ZF100R";"TC 5000 R 1600 FMC";"23674912";"236749_001_02";"22.05.2012";;"WEMO";;"rusitiafr1";"0";;;;;616057.125;619340.250;6.7705;6.8065;2.2987;"22.02.2019";"16:08:35";"236781_001_03(M2)";2;"Salvagnini S4";19;"DX51D+ZF100R";1870.000;400.380;1.400;;"652514_001_03";"652514_001_03";"COD";;"DX51D+ZF100R";"KOPFNUMMER_060";"23678113";"236781_001_03";"31.01.2018";;"T1";"SALVA S4-P4";;;;;;;740352.0625;748710.625;8.1365;8.2283;0.237;"28.01.2019";"16:26:51";"236781_001_03";1;"TC 5000 R 1600 FMC";19;"DX51D+ZF100R";1870.000;400.380;1.400;;"652514_001_03";"652514_001_03";;;"DX51D+ZF100R";"TC 5000 R 1600 FMC";"23678113";"236781_001_03";"11.12.2017";;"T1";;"MEFA";"0";;;;;740352.0625;748710.625;8.1365;8.2283;0.7502;"28.01.2019";"16:26:48";"236781_001_03_999999";1;"TC 5000 R 1600 FMC";19;"DX51D+ZF100R";1870.000;400.3801;1.400;;"652514_001_03";"652514_001_03";;;"DX51D+ZF100R";"TC 5000 R 1600 FMC";"23678113";"236781_001_03";"11.12.2017";;"T1";;"MEFA";"0";;;;;740352.0625;748710.625;8.1365;8.2283;0.7502;"28.01.2019";"16:17:17";

Das ist natürlich nur ein kleiner Auschnitt, wir sprechen hier von einigen 100'000 Dateien und Zeilen in der "ARCHIV" Dateien. Das ganz muss auch nicht schnell gehen. Sobald mal alle alten Daten gelöscht wurden soll die Batch Datei wöchentlich (Wochenende) über die Aufgabenplanung ausgeführt werden. Dann sind es geschätz so 5000 Dateien pro Woche.


Ich möchte nun die erste Zeile der Log Datei in 3 Variabeln schreiben(path, name & date).

Mit Pfad soll zuerst der Pfad festgelegt werden. Da Drin soll geprüft werden ob die Datei "ARCHIV existiert" wenn nein Zeile in Log löschen und wieder von vorne (Schleife)
Wenn ja soll mithilfe der Variable "name" die Zeile in der "ARCHIV" Datei gesucht werden. Die Variable "date" soll verwendet werden um zu prüfen ob die gefunden Zeile dieses Datum auch enthält, 
wenn ja Zeile in der "ARCHIV" Datei und in der Log Datei löschen. Wenn nein nur Zeile in Log löschen und wieder von vorne (Schleife).

Was ich bisher, neben der ForFiles Anweisung habe: 


@echo off

for /f "delims=; tokens=1" %%a in ('more/e +0 ^< deleted.log') do (
  if not defined p set "p=%%a"
)
echo %p%


for /f "delims=; tokens=2" %%a in ('more/e +0 ^< deleted.log') do (
  if not defined n set "n=%%a"
)
echo %n%


for /f "delims=; tokens=3" %%a in ('more/e +0 ^< deleted.log') do (
  if not defined d set "d=%%a"
)
echo %d%

pause


findstr /V /s "1236789" ARCHIV.txt > P:\test\ar1111\ARCHIV_.txt


Das Problem ist da auch noch das die neue Datei den Pfad enthält. Das sieht dann so aus:

ar1111\ARCHIV.txt:1236_01.txt
ar1111\ARCHIV.txt:12367_02.txt
ar1111\ARCHIV.txt:123678_03.txt

anstatt so: 

1236_01.txt
12367_02.txt
123678_03.txt

Kann mir da jemand helfen?

Gruss

Fabio



Ausgaben von PowerShell Scripts in CSV Dateien ausgeben

$
0
0

Hallo zusammen

Ich möchte die beiden Ausgaben (werde momentan in der PowerShell angezeigt) des untenstehenden PowerShell Scriptes in zwei CSV Dateien speichern.

Wie verwende ich den Befehl "Out-File" hier richtig?

Danke im Voraus für die Hilfe!

# to get Get-ADGroup etc...
# Add-WindowsFeature RSAT-AD-PowerShell
$allGroups = Get-Content groups.csv
foreach ($sourceGroup in $allGroups)
{
    $adGroupName = $sourceGroup -replace 'PROD\\', ''
   
    try
    {
        $sourceADGroup = Get-ADGroup $adGroupName -ErrorAction SilentlyContinue
        $destADGroup = Get-ADGroup -server axusr.net $adGroupName -ErrorAction SilentlyContinue
       
        $sourceMembers = Get-ADGroupMember $sourceADGroup
        $destMembers = Get-ADGroupMember -Server axusr.net $destADGroup
        $missingInSource = $destMembers.samaccountname | ? { $sourceMembers.samaccountname -notcontains $_ }
        $missingInDest = $sourceMembers.samaccountname | ? { $destMembers.samaccountname -notcontains $_ }
       
        # exclude service accounts
        $missingInDest = $missingInDest | ? { $_ -notmatch '^SVC[-_].*' }
        # exclude d-accounts (bad check)
        $missingInDest = $missingInDest | ? { $_ -notmatch '^SAPService.*' }
        <#
        # exclude dt-accounts
        $missingInDest = $missingInDest | ? { $_ -notmatch '^DT.*' }
        # exclude d-accounts (bad check)
        $missingInDest = $missingInDest | ? { $_ -notmatch '^D.*' }
        #>
        if ($missingInDest.Count -gt 0 -or $missingInSource.Count -gt 0)
        {
            "---------------------"
            $adGroupName + ": " + $sourceMembers.Count + "/" + $destMembers.Count
            if ($missingInDest.Count -gt 0)
            {
                "missing in dest:"
                $missingInDest
            }
            if ($missingInSource.Count -gt 0)
            {
                "missing in source:"
                $missingInSource
            }
        }
    }
    catch { Write-Warning "ad group '$adGroupName' does not exist in AXUSR" }

}



"Fehler: Beschreibung = Die Anfrage ist ungültig"

$
0
0

Hallo zusammen

Ich benötige eine Möglichkeit, von einem Windows 7 in einer Linux-VM zu erkennen, an welchem von zwei Standorten sich der Rechner befindet, um den dortigen Drucker als Default zu setzen. An dem einen Standort sind die Drucker ein direkt angeschlossener USB-Drucker und ein Netzwerkdrucker, an dem anderen Standort nur der Netzwerkdrucker.

Ich habe weder auf dem Windows 7, noch auf dem mir unbekannten Linux Administrator-Rechte.

Mit:

set-variable -name wahl (Get-WmiObject -query "SELECT Name FROM Win32_Printer WHERE (Portname LIKE 'USB%') AND (WorkOffline = FALSE)" | ft Name)

erhält die Variable 'wahl' den Namen des USB-Druckers, wenn er erreichbar ist. Ist er es nicht, weil sich der Rechner am anderen Standort befindet, bleibt die Variable leer. Nun habe ich per IF die Möglichkeit je nach Befüllung von 'wahl' den Default-Drucker zu setzen, was ich hiermit versuche:

if ($wahl -eq "" ) {
wmic printer where name='\\printserv\PRINT-7402-3' call setdefaultprinter
 echo                   "Drucker-1 als Standard gesetzt."
}

else {
wmic printer where name='HP OfficeJet Pro 8210 PCL 6' call setdefaultprinter
 echo                   "Drucker-2 als Standard gesetzt."
}

Das Script wählt je nach Standort den richtigen Drucker und läuft ohne rote Fehlerzeilen durch. Jedoch bekomme ich bei der Ausführung vor der Einblendung der Ausgabe, von "Drucker-2 als Standard gesetzt." lapidar die im Titel genannte Fehlermeldung"Fehler: Beschreibung = Die Anfrage ist ungültig". Der Standard-Drucker wird danach nicht geschaltet.

Wie bekomme ich als blutiger Powershell-Neuling heraus, wo es jetzt noch hakt, bzw. wer kann meinen Code lauffähig machen?

Liebe Grüße, der Rudi

Bei foreach ($line in $file) Zeilen überspringen

$
0
0

Hallo,

ich hab folgendes Problem.

Ich hab eine längere Textdatei die folgendermaßen in etwa aufgebaut ist.

Category: " "
Name: " "
Value: " "
Default: " "
Type: " "

Nun brauche ich nur die Werte aus Category, Name und Value.

Das ich das bekomme hab ich schon.

Nun brauche ich allerdings nur die Werte die zur Category "Software" gehört und den dazugehörigen Name und den Value.

Gibt es eine Möglichkeit bei einer foreach Schleife zu sagen, wenn Zeile Category nicht Software ist überspringe die nächsten 4 Zeilen.

Gruß

Fabiii


Auswahl in Dropdownmenü durch Checkbox verändern.

$
0
0

Hallo zusammen,

Ich versuche eine GUI zu bauen, bei es mehrere Checkboxen gibt und wenn eine Checkbox angeklickt wird, soll dies den Content beeinflussen, der dann in Dropdowns verfügbar ist. 

Ich scheitere nun daran, den Status der Checkbox dauerhaft zu "überwachen". Initial beim Start des Scripts habe ich den Status, wenn ich dann in der GUI die Checkbox anklicke, wird diese Veränderung nicht erkannt und ich habe noch keine Lösung gefunden, die ich zum laufen bekommen haben. Vll. kann mir ja jmd. erklären, wie man das macht. 

Anbei noch der Code meiner GUI:

$header = "Mailadresse","Mandant", "Opt1","Opt2","Opt3","Opt4","Opt5"

$kontakte = Import-Csv -Path 'XXXX\Kontakte.csv' -Header $header

$Mandant = $kontakte.Mandant
$Opt1 = $kontakte.Opt1
$Opt2 = $kontakte.Opt2
$Opt3 = $kontakte.Opt3
$Opt4 = $kontakte.Opt4
$Opt5 = $kontakte.Opt5

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '800,400'
$Form.text                       = "Form"
$Form.TopMost                    = $false

$CheckBox1                       = New-Object system.Windows.Forms.CheckBox
$CheckBox1.text                  = "Opt1"
$CheckBox1.AutoSize              = $false
$CheckBox1.width                 = 100
$CheckBox1.height                = 20
$CheckBox1.location              = New-Object System.Drawing.Point(10,20)
$CheckBox1.Font                  = 'Microsoft Sans Serif,10'


$CheckBox2                       = New-Object system.Windows.Forms.CheckBox
$CheckBox2.text                  = "Opt2"
$CheckBox2.AutoSize              = $false
$CheckBox2.width                 = 100
$CheckBox2.height                = 20
$CheckBox2.location              = New-Object System.Drawing.Point(110,20)
$CheckBox2.Font                  = 'Microsoft Sans Serif,10'

$CheckBox3                       = New-Object system.Windows.Forms.CheckBox
$CheckBox3.text                  = "Opt3"
$CheckBox3.AutoSize              = $false
$CheckBox3.width                 = 100
$CheckBox3.height                = 20
$CheckBox3.location              = New-Object System.Drawing.Point(210,20)
$CheckBox3.Font                  = 'Microsoft Sans Serif,10'

$CheckBox4                       = New-Object system.Windows.Forms.CheckBox
$CheckBox4.text                  = "Opt4"
$CheckBox4.AutoSize              = $false
$CheckBox4.width                 = 100
$CheckBox4.height                = 20
$CheckBox4.location              = New-Object System.Drawing.Point(310,20)
$CheckBox4.Font                  = 'Microsoft Sans Serif,10'

$CheckBox5                       = New-Object system.Windows.Forms.CheckBox
$CheckBox5.text                  = "Opt5"
$CheckBox5.AutoSize              = $false
$CheckBox5.width                 = 100
$CheckBox5.height                = 20
$CheckBox5.location              = New-Object System.Drawing.Point(410,20)
$CheckBox5.Font                  = 'Microsoft Sans Serif,10'




$Filter1                         = New-Object system.Windows.Forms.ComboBox
$Filter1.text                    = "Filter1"
$Filter1.width                   = 100
$Filter1.height                  = 20
$Filter1.location                = New-Object System.Drawing.Point(8,120)
$Filter1.Font                    = 'Microsoft Sans Serif,10'





$Filter2                         = New-Object system.Windows.Forms.ComboBox
$Filter2.text                    = "Filter 2"
$Filter2.width                   = 100
$Filter2.height                  = 20
$Filter2.location                = New-Object System.Drawing.Point(119,120)
$Filter2.Font                    = 'Microsoft Sans Serif,10'
$Filter2.Items.AddRange($Opt1)

$Filter3                         = New-Object system.Windows.Forms.ComboBox
$Filter3.text                    = "Filter3"
$Filter3.width                   = 100
$Filter3.height                  = 20
$Filter3.location                = New-Object System.Drawing.Point(230,120)
$Filter3.Font                    = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($Filter1,$Filter2,$Filter3,$CheckBox1,$CheckBox2,$CheckBox3,$CheckBox4,$Checkbox5))


[void] $Form.ShowDialog()

Schon mal sorry, wenn das eigentlich total offensichtlich ist, aber mit GUIs hatte ich noch nichts zu tun.

löschen von Zeilen in großen csv Dateien

$
0
0

Ich habe das Problem, dass ich sehr große csv Dateien mit mehr Zeilen bekommen, als excel verarbeiten kann.

Deshalb möchte ich bestimmte Zeilen vorab löschen, das funktioniert auch mit meinen script,
dauert aber echt Stunden.
Daher die Frage, geht das auch schneller ? Die csv Datei ist größer als 50MB und weit mehr als 1.048.576 Zeilen

clear-Host
$file = Get-Content "S:\liste.csv"
$str | out-file S:\liste_1.csv  -Encoding ascii   # Inhalt der Datei löschen
foreach ($str in $file)
{
    if ($str -like '*text*') {
       # SubString ist nicht enthalten; die * sind bedingt erforderlich
    } else {
       $str | out-file S:\liste_1.csv -append   -Encoding ascii # SubString ist enthalten -> Zeile wird an die Datei angehängt
    }    
}

Hat jemand eine Lösung für höheres Tempo?

mfg Klaus

Ordnerliste mit Dateipfaden

$
0
0

Hallo!

Ich muss für mein Praktikum einen Powershell Skript schreiben, welches ein Laufwerk auf eine andere Festplatte kopiert. Danach soll eine Auflistung der kopierten Ordner und deren Dateipfad stehen. Ich habe davor noch nie Powershell verwendet, weshalb ich mich nicht besonders auskenne.

Hier wäre der Code der die Ordner auflistet leider jedoch nicht die Pfade.

Get-ChildItem -Attributes !Archive -Path $destination -recurse | SELECT Attributes, Name|  Format-Table -AutoSize ;

Über Hilfe wäre ich sehr dankbar!

Array Probleme

$
0
0

Ich möchte mit den beiden Funktionen ein Multiarray erstellen. Die Daten sollen identisch diesem Array sein:

[Array]$mnu = @(
	@(0, "Datei", @(
			@(1, "Öffnen"), @(2, "Speichern"), @(3, "-"), @(4, "Beenden"))
	),
	@(5, "Bearbeiten", @(
			@(6, "Neu"), @(7, "Rückkängig"), @(8, "Wiederhohlen"))
	),
	@(9, "Hilfe", @(
			@(10, "Hilfe"), @(11, "Info"))
	)
				)

Hier meine Funktionen und der Code mit dem ich dieses Array erstellen möchte!

function cb-menu-submenu-item-add (){
    param(
        [int]$id,
        [string]$name,
        [array]$submenu = @()
	)
    $submenu += ,@($id,$name)
    return $submenu
}
function cb-menu-menu-item-add(){
    param(
        [int]$id,
        [string]$name,
        [array]$submenu,
        [array]$menu = @()
    )
    $menu += ,@($id,$name,$submenu)
    return $menu
}

$sub = cb-menu-submenu-item-add -id 1 -name "Öffnen" 
$sub = cb-menu-submenu-item-add -id 2 -name "Speichern" -submenu $sub
$sub = cb-menu-submenu-item-add -id 3 -name "-" -submenu $sub
$sub = cb-menu-submenu-item-add -id 4 -name "Beenden" -submenu $sub
$menu = cb-menu-menu-item-add -id 0 -name "Datei" -submenu $sub 

$sub = cb-menu-submenu-item-add -id 6 -name "Neu"
$sub = cb-menu-submenu-item-add -id 7 -name "Rückkängig" -submenu $sub
$sub = cb-menu-submenu-item-add -id 8 -name "Wiederhohlen" -submenu $sub
$menu = cb-menu-menu-item-add -id 5 -name "Bearbeiten" -submenu $sub -menu $menu

$sub = cb-menu-submenu-item-add -id 10 -name "Hilfe" 
$sub = cb-menu-submenu-item-add -id 11 -name "Info" -submenu $sub
$menu = cb-menu-menu-item-add -id 9 -name "Hilfe" -submenu $sub -menu $menu


$mnu | out-string > "d:\mnu.txt"

$menu | out-string > "d:\menu.txt"

Warum ist $mnu <> $menu? Wo ist mein Denkfehler? Oder ....

Für jede Hilfe bin ich dankbar!

Christian

SQL Befehl in Variable escapen

$
0
0

Hallo an alle PowerShell-Geeks ;-),

ich habe zwei SQL Befehl die in eine Variable "gepackt" habe und dann über PowerShell ausführen will. 

1. Problem temporäre Tabelle

Ich möchte gern

$testva ="SELECT * from #TESTDB" Jedoch tut sich PowerShell mit dem Zeichen # schwer. Was kann ich hier tuen?

2. Problem 

ich möchte gern eine Variable $va1 in die SQL Abfrage einbetten:

$Query="INSERT INTO [dbo].[ADlog] ([PersNr],[ADFeld],[Wertvorher],[Wertdanach],[Zeitstempel]) VALUES ('02354','test',$va1, 'GGG2', Getdate())" 

jedoch bekomme ich es nicht hin. Kann mir jemand helfen?

Danke schon mal vorab 


Properties eines dynamisch erzeugten Objekts ändern

$
0
0

Hallo zusammen,

ich will dynamisch eine Anzahl von Checkboxen erzeugen. In meinem Fall für Jeden Wert in einem Array sollen 2 Checkboxen erzeugt werden.

Dafür habe ich folgende Schleife:

foreach ($Value in $Values) 
                    {for ($i= 1; $i -le 2; $i++)
                    {
                     New-Variable -Name ("CheckBox"+$Value+$i) -Value (New-Object system.Windows.Forms.CheckBox)

#Versuche, die Properties zu ändern
#Variante 1                 
   $dynvar =  ("CheckBox"+$Mandant+$i)
   $dynvar.Text          ="Opt"+$i
#Variante 2
  ("CheckBox"+$Mandant+$i).Text      ="Opt"+$i
                    }
                   } 

Nun schaffe ich es nicht, das Objekt über seinen dynamisch erzeugten Namen korrekt anzusprechen, denn in 

("CheckBox"+$Value+$i)

steht nur der Name des Objekts.

Jetzt ist meine Frage, wie ich das Objekt korrekt anspreche, um die Properties anzupassen.

Schon mal danke.

Gruß

RabbittMQ Daten mit Powershell ins AD übergeben

$
0
0

Hallo zusammen,

wir würden eigentlich gerne Daten vom RabbitMQ mit Powershell ins AD übertragen. Das funktioniert im Prinzip, jedoch nicht mit allen Attributen auf einmal. Falls jemand eine Idee hat, wäre ich dankbar....

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$OU_Path = "OU=ABC_USERS,OU=XX_ABC,DC=domain,DC=meine,DC=de"
$profilePath = "\\meine.domain.de\Profil\Profildaten\$SamAccountName"
$homeDrive = "H"
$homeDirectory = "\\meine.domain.de\Daten\Userdaten\$SamAccountName"


$Params = @{
    BaseUri = "https://rabbitmq.meine.domain.de:47111"
    Credential = $credRabbit
}

$QueueName = 'pstestqueue'

$Incoming = Get-RabbitMQMessage @params -VirtualHost / -Name $QueueName -count 1
$IncomingData = $Incoming.payload | ConvertFrom-Json
#AD User:
#AD User anlegen wenn noch nicht vorhanden:
if (@(Get-ADUser -Filter { SamAccountName -eq $SamAccountName }).Count -eq 0) {
    $newUser = @{
       Path = $OU_Path
       UserPrincipalName = "$SamAccountName@ads.katsh.de"
       SamAccountName = $SamAccountName
       profilePath = $profilePath
       homeDrive = $homeDrive
       homeDirectory = $homeDirectory
       name = $DisplayName
    }
New-ADUser @newUser
}
$changeUser = $IncomingData.changeUser
#AD User Änderungen:
Get-ADUser -Identity $IncomingData.SamAccountName | Rename-ADObject -NewName $IncomingData.changeUser.DisplayName
Get-ADUser -Identity $IncomingData.SamAccountName | Set-ADUser -GivenName $IncomingData.changeUser.GivenName
#AD User: Change PW:
if ($IncomingData.Password -ne "") {
    Set-ADAccountPassword -Identity $IncomingData.SamAccountName -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $IncomingData.Password -Force)
}

Get-ADUser -Identity $IncomingData.SamAccountName | Set-ADUser -GivenName $IncomingData.changeUser.GivenName

So geht es (aber eben nur mit GivenName)

Get-ADUser -Identity $IncomingData.SamAccountName | Set-ADUser -GivenName $IncomingData.changeUser.GivenName

FG

Helmut

Script zur Abfrage von Daten aus der AD

$
0
0

Hallo zusammen,

ich bin nicht nur neu hier im Forum sondern auch ein absoluter Anfänger in PowerShell. Deshalb wende ich mich hilfesuchend an euch.

Ich habe auf dem Server im Geschäft ein angefangenes Script gefunden dass mir und meinen Kollegen/innen die Arbeit erleichtern würde. Es geht um die Abfrage von Paten für Verzeichnisse. Die Namen der Paten sind in der AD unter Description eingetragen. Ich habe zunächst das Script laufen lassen und keine Ergebnisse erhalten. Es wurde lediglich der LOG erzeugt. Im ersten Schritt habe ich dann zunächst am Anfang, nach der Eingabe des Namens ein "Enter warten Enter" und Ende des Scripts eine Pause eingetragen. Nun werden sichtbare Ergebnisse geliefert. Enter wart Enter hat den Hintergrund das dass Script nach dem ersten Enter sucht und beim zweiten Enter Ergebnisse liefert. Drückt man direkt zwei x Enter springt das Script ans Ende.

Nun wollte ich auf Anfrage meiner Kollegen am Ende noch eine Schleife einbauen. Die Frage "Sollen noch weitere Paten gesucht werden?" kommt auch. Nun ist es aber so dass es egal ist ob j oder n eingegeben wird - n jedem Fall wird das Script beendet. Eine neue Abfrage wird nicht gestartet. Es fehlt wohl der "while-Befehl" am Anfang des Scripts. Hier bin ich nun mit meinem Latein am Ende und ihr Fachleute kommt ins Spiel. Anbei ein Screenshot des Scripts in seiner aktuellen Version.

Ich möchte gerne dass bei Eingabe n das Script beendet wird und bei j ein clear screen gemacht wird und das Script von vorne läuft.

Im Voraus schon einmal vielen Dank für eure Unterstützung und Hilfe.

Gruß Lucky

Zusatz: Screenshot muss ich nachliefern da mein Konto noch nicht geprüft ist.

Zeilen:

62 Write-Host

63 Write-Host "Der Pate wurde erfolgreich abgefragt!" -ForegroundColor Red

64 Write-Host

65 $Frage = Read-Host "Weiteren Paten abfragen (j/n)"

66 if($Frage -eq "n")

67 {

68 $Loop=$true

69 Write-host

70 }

71 Else{Clear-host}

Zeilenblock aus mehreren Dateien löschen

$
0
0

Hallo, ich bin ziemlicher Anfänger in Powershell und hänge an folgendem Problem fest:

Ich muss aus ~200 Dateien, die alle "PC-"und dann eine Zahlenfolge als Namen haben, die Zeilen 27-38 löschen.

Mit meinem bisherigen Code schaffe ich es zwar, diese Löschung an einzelnen Dateien vorzunehmen, aber ich schaffe es nicht , den Input und Output als Variable zu erstellen.

Hier der bisherige Code:

$path =  "C:\Users\lea33631\Desktop\PC-kopie.cmd"
$create = Out-File "C:\Users\lea33631\Desktop\PC-kopie3.cmd"
Get-Content $path 


$content[26] = 'delete'
$content[27] = 'delete'
$content[28] = 'delete'
$content[29] = 'delete'
$content[30] = 'delete'
$content[31] = 'delete'
$content[32] = 'delete'
$content[33] = 'delete'
$content[34] = 'delete'
$content[35] = 'delete'
$content[36] = 'delete'
$content[37] = 'delete'

Get-Content "C:\Users\lea33631\Desktop\PC-kopie3.cmd"

foreach($line in $content){
    
    if($line -notlike 'delete'){
        echo $line >> "C:\Users\lea33631\Desktop\PC-kopie3.cmd"
    }
}
Remove-Item "C:\Users\lea33631\Desktop\PC-kopie.cmd"
rename-item "C:\Users\lea33631\Desktop\PC-kopie3.cmd" "C:\Users\lea33631\Desktop\PC-kopie.cmd"

Wahrscheinlich stelle ich mich hier nur doof an, aber vielleicht kann mir da ja jemand helfen?

Vielen Dank schonmal im Voraus.

Symlink Ziel per Script aendern

$
0
0

Hallo liebe Leser,

aktuell haben wir folgendes Problem,

wir hatten per Script in einer Ordnerstruktur nach Dateien mit der Endung *.mrk suchen lassen.

Diese wurden dann in einem Ordner verschoben und danach erstellte das Script an dem Ursprungsort der jeweiligen Datei eine Verknüpfung mit dem neuen Ziel der Datei.

Leider ist und bei der Angabe des Laufwerksbuchstabens im Zielpfad ein Fehler unterlaufen. Nun befinden sich alle *.mrk Dateien zwar an ihrem neuen Ort, die erstellten Verknüpfungen gehen aber leider nicht.

Jetzt versuchen wir mithilfe eines anderen Scriptes die Pfad in jeder gefundenen Verknüpfung auszulesen und mit einem neuen, geänderten Pfad wieder zu speichern.

Das klappt wunderbar im Test auf einem Windows 10 Client.
Wenn wir dieses Script aber auf einem Windows 2012 R2 Server ausführen, werden ab einem bestimmten Punkt keine Schritte mehr abgearbeitet und die Verknüpfungen erhalten als Ziel "Computer" und gehen somit nicht.

Wir brauchen hier eure Unterstützung!
Hier erst einmal das Script:

#modify variables accordingly 
$fileName ="*.mrk" 
$folder = "C:\Users\Doe\Documents\Powershell" 
[string]$from = "C:\Users\Doe\Documents\Ziel\" 
[string]$to = "C:\Users\Doe\Documents\Ziel1\" 
$list = Get-ChildItem -Path $folder -Filter $fileName -Recurse  | Where-Object { $_.Attributes -ne "Directory"} | select -ExpandProperty FullName 
$obj = New-Object -ComObject WScript.Shell 
ForEach($lnk in $list) 
      { 
 #create the shortcut object
 $WshShell = New-Object -ComObject WScript.Shell
 [string]$path = (Get-Item $lnk).DirectoryName
 write $path
 [string]$name = (Get-Item $lnk).Name.Replace(".mrk",".lnk")
 write $name
 $Shortcut = $WshShell.CreateShortcut("$($path)\$($name)")
 #program the shortcut will open
[string]$lnkTarget = (Get-Item $lnk).Target
write $lnkTarget
$lnkTarget = ($lnkTarget).Replace($from,$to)
write $lnkTarget
 $Shortcut.TargetPath = $lnkTarget
 #save the modifications
 $Shortcut.Save()

 write " "

   Remove-Item $lnk

  } 

Ab der Zeile 19 ([string]$lnkTarget = (Get-Item $lnk).Target) geht nichts mehr.
Das System findet wohl .Target nicht.

Wie gesagt, das Script funktioniert einwandfrei auf einem Windows 10 System.

Weiß hier jemand, woran das liegen kann?

Vielen, vielen Dank im Voraus

Grüße Oliver


Viewing all 2314 articles
Browse latest View live


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