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

Powershell script welches automatisch eine Wlan Verbindung herstellt.

$
0
0

Wie im Titel schon schlecht umschrieben, versuche ich ein Powershell script zu schreiben welches sich sobald man es ausführt im Wlan anmeldet. Ein Beispiel: Ich habe einen neuen Laptop und möchte das wenn ich dass Script starte dieses den Laptop mit dem Wlannetz verbindet, mit automatischer Passwort eingabe usw. Sprich komplett automatisch. Hat da wer ne Idee oder im besten Fall schon nen fertiges script?

Das einzige was ich bis jetzt geschafft habe, war ein YouTube Video nach zu basteln, man lässt sich das Wlan Profil als xml ausgeben, schreibt dann eine ps1 mit folgendem Inhalt: netsh wlan add profile filename="$PSScriptRoot\Name der xml datei.xml 

und eine bat mit folgendem Inhalt:

 @ECHO OFF

PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%~dpn0.ps1""' -Verb RunAs}"
exit

Gebracht hat mir das aber nichts :0

LG
EinHilfloserITler



Prüfen ob es bestimmte Wert in der Registry gibt, wenn ja Name in Variable packen

$
0
0
Hallo,
ich kenne mich bis dato leider nicht mit Powershell aus.
Ich möchte an einer bestimmten Stell prüfen, ob es dort einen Wert in der Registry gibt.

Wenn es den Wert gibt, soll eine Variable mit dem Namen des Wertes gefüllt werden.
Derzeit sind 6~7 Werte denkbar, die dort stehen können.
Leider klappen meine Versuche bis dato nicht.
Kann jemand helfen?

Pfad wäre z.B. HKLM:\SOFTWARE\WOW6432Node\Intel\
Dort soll geschaut werden ob es den Eintrag X, Y oder Z gibt, wenn ja, soll $var mit X,Y oder Z gefüllt werden.

Danke,
Gruß

Wechseldatenträger auslesen

$
0
0

Hallo,

ich wollte mir ein kleines Script schreiben, dass meine Daten auf einen ausgewählten Wechseldatenträger kopiert. Kennt jemand einen Befehl, der alle angeschlossenen Wechseldatenträger ausliest und in Powershell auflistet?

Mit freundlichen Grüßen

der Anonyme

Find Regestry-path for service with powershell / Regestry-Pfad eines Service mit Powershell ermitteln

$
0
0
Dear all,

I'm just getting started with Powershell over here and decided to write a script which renames services. For that I intend to use rename-item.

Said script, however, should be as flexible as possible since it has to work with multiple services in diffrent locations. The user provides the name of a service, nothing else. If possible I would like to keep it this way.

So the question comes to mind: is there a way to get the reg-path from the service name in a form where I can save it as string for later use? Please note that I already found a way to get the path for the exe of the service, and that I'm looking to the reg path (something like HKEY_local) instead.

Kind regards and many thanks in advance.

__________________________________________________________________________________________

Servus zusammen,

ich habe mich gestern in die noch sehr verwirrende Welt von Powershell geschmissen und arbeite derzeit an einem Script, welches Dienste umbennenen soll. Ich verwende hierbei rename-item.

Das Script soll allerdings möchlichst vielseitig verwendbar sein, und es handelt sich nicht immer um den gleichen Dienst oder Pfad. Effektiv gibt der User am Anfang einen Dienstnamen an, welcher geändert werden soll. Mehr Informationen sollen nicht, wenn vermeidbar, nötig sein.

Daher: gibt es einen Befehl um basierend auf dem Namen des Dienstes dessen Reg-Pfad zu erfahren und in einer Variable zu speichern?
Gefunden habe ich nur Wege für den Pfad zur Exe des Service; mit geht es aber eben um den HKEY_local Pfad.

Besten Gruß und vielen Dank voraus!

Besserer Alternative ein Fenster zu aktiveren als Appactivate

$
0
0

Hallo,

gibt es eine zuverlässige Alternative zu diesem Beispielcode.

if($wshell.AppActivate($WINDOW){
   $wshell.SendKeys($KEYS)
}

Wenn ich eine bat Datei im File Explorer öffne, indem eine .ps1 Datei ausgeführt wird und das Script einen Browser(WINDOW) öffnet, soll es F11(KEYS) schicken. Was passiert zuallerst wird der FileExplorer in den Vollbildmodus gesetzt und dann erst der Browser. (Liegt daran das es ne Dauerschleife gibt, die erst unterbricht wenn der Browser im F11 Modus ist. )

Wie schaffe ich es, dass er den FileExplorer nicht mit F11 versieht. Ansich funktioniert das Script, nur das mit dem FileExplorer ist unschön. Man kanns manuel lösen, indem man mit der Maus nach dem Starten auf den Desktop klickt. Ist aber auch keine zuverlässige Lösung.

Jemand bessere Ansätze?

Danke.

AD User Anhand einer CSV Datei erstellen und pflegen

$
0
0

Guten Tag,
ich bin noch recht ein Anfänger mit Powersell und bräuchte Hilfe, da ich einfach nicht schaffe, bei Usern, welche vorher ÜÖÄ im Namen hatten zu erfassen und ihre Einträge zu ändern.

Der Script soll drei Sachen machen.
User über eine CSV Datei erstellen, wenn diese vorhanden sind, dann deren Einträge anpassen(Telefonnummer, Position, Titel, Straße etc) und wenn Sie noch Umlaute im Namen haben die dann beim erstellen umwandeln, da ansonsten Email und Domainlogin Umlaute im Namen haben.

Import-Module ActiveDirectory
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn;
$Import =Import-CSV “c:\temp\User.csv”  -Delimiter ";" -Encoding:UTF8
$OU = “OU=Firma,OU=Testuser,DC=zero,DC=int”

Foreach ($user in $Import)
{


function Convert-Umlaut
{
  param
  (
    [Parameter(Mandatory)]
    $Text
  )
    
  $output = $Text.Replace('ö','oe').Replace('ä','ae').Replace('ü','ue').Replace('ß','ss').Replace('Ö','Oe').Replace('Ü','Ue').Replace('Ä','Ae')
  $isCapitalLetter = $Text -ceq $Text.toUpper()
  if ($isCapitalLetter) 
  { 
    $output = $output.toUpper() 
  }
  $output
}
$VNkurz = Convert-Umlaut $user.Vorname
$NNkurz = Convert-Umlaut $user.Nachname
$kurz = ($NNkurz  + $user.Domainname)

#Überprüft, ob User schon existiert
if (Get-ADUser -Filter { SamAccountName -eq $kurz}) 
{
 Set-ADUser -identity ($user.Nachname  + $user.Domainname)`
    -Department $user.Position`
    -Title $user.Titel `
    -Description $user.Visitenkarte`
    -Company $user.Firma `
    -StreetAddress $user.Straße `
    -PostalCode $user.PLZ`
    -City $user.Ort`
    -MobilePhone $user.Mobil`
    -OfficePhone $user.Phone`
    -HomePage $user.Website`
}
else
{
$password = $user.password | ConvertTo-SecureString -AsPlainText -Force
New-ADUser -Name ($user.Nachname + " " + $user.Vorname) `
    -GivenName $user.Vorname `
    -Surname $user.Nachname `
    -UserPrincipalName ($NNkurz  + $user.Domainname + $user.UPN) `
    -sAMAccountName ($NNkurz  + $user.Domainname) `
    -Department $user.Position`
    -Title $user.Titel `
    -Description $user.Visitenkarte`
    -Company $user.Firma `
    -StreetAddress $user.Straße `
    -PostalCode $user.PLZ`
    -City $user.Ort`
    -MobilePhone $user.Mobil`
    -OfficePhone $user.Phone`
    -HomePage $user.Website`
    -Path $OU -AccountPassword $Password -ChangePasswordAtLogon $True -Enabled $True

#Mailbox anlegen
Get-User ($NNkurz  + $user.Domainname + $user.UPN) | Enable-Mailbox -Alias ($VNkurz + "." + $NNkurz) -DisplayName ($user.Nachname +" "+ $user.Vorname) 
  }
 }

Wenn ich den Code ausführe und die User schon existieren, dann bekomme ich folgende Fehlermeldung:

Set-ADUser : replace
In C:\temp\Test4.ps1:33 Zeichen:2+  Set-ADUser -identity ($user.Nachname  + $user.Domainname)`+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+ CategoryInfo          : InvalidOperation: (ZimmermannM:ADUser) [Set-ADUser], ADInvalidOperationException+ FullyQualifiedErrorId : ActiveDirectoryServer:0,Microsoft.ActiveDirectory.Management.Commands.SetADUser

Ich habe schon einige Sachen versucht, was man an den verweisten Funktion sieht. Aber ich komme nicht dahinter, was falsch ist. Vielleicht wird auch mir die falsche Stelle als fehlerhaft angezeigt?

LPR Ports ändern

$
0
0

Hallo,

wie könnte ein Script aussehen, welches mir 2500 TCP IP Ports automatisiert auf LPR Ports umstellt?

Grüße

Getrennte Benutzer automatisch abmelden ?

$
0
0
Hallo,
bei uns arbeiten die User mit ThinClients an Terminalservern. Da auch die Mehrfachanmeldung erlaubt ist, läuft irgendwann immer der Arbeitsspeicher durch noch vorhandene,aber getrennte Benutzersitzungen voll, weil unsere User lieber die "Trennen"-Option statt "Abmelden" nutzen. Nun, das könnte man vielleicht unterbinden,indem man einfach die "Trennen"-Option ausblendet, aber dann schalten sie einfach frech den ThinClient hart über den Powerbutton aus. Leider scheint die Option der Terminalserver, automatisch getrennte Sitzungen nach einer gewissen Frist abzumelden, nicht wirklich zu funktionieren (Sitzungszeitlimit).
Bisher habe ich einfach alle paar Tage die getrennten Sitzungen per Taskmanager abgemeldet, aber das ist mehr als lästig. Alternativ gehts auch damit, sich mit "qwinsta" die getrennten Sitzungen anzeigen zu lassen und per und "logoff" unter Angabe der SitzungsID manuell abzumelden, aber auch das ist nervig. Gibts vielleicht eine Möglichkeit, das über die Powershell zu regeln ?

Powershell WPF XAML

$
0
0

Hallo zusammen,

ich entwickel gerade ein Tool das Verwaltungsaufgaben für uns Admins einfacher machen soll. Dazu gibt es ein Feld namens "tbUserDetail", in den Der username oder Samaccountname eingetragen wird. Der Canvas-Block ist mein Versuch aus einem Anderen Skript, welches ich gefunden hatte, die Logik zu adaptieren. 

[xml]$xaml = @"<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        Title="Toolbox" Height="500" Width="850" SizeToContent="Manual"><Grid><Grid.RowDefinitions><RowDefinition Height="0.1*"/><RowDefinition Height="0.8*"/><RowDefinition Height="0.1*"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><ListBox Name="tbMain" Margin="10,124,240,10"  RenderTransformOrigin="0,1" MinWidth="500" MinHeight="300"><ListBoxItem></ListBoxItem></ListBox><Button Name="btnLager" Content="Lager" Margin="0,125,37,0" VerticalAlignment="Top" Height="40" HorizontalAlignment="Right" Width="125"/><Button Name="btnUnbekannt" Content="Unbekannte" Margin="0,203,37,0" VerticalAlignment="Top" Height="40" HorizontalAlignment="Right" Width="125"/><Button Name="btnUserPc" Content="User Oder PC" Margin="0,292,37,0" VerticalAlignment="Top" Height="40" HorizontalAlignment="Right" Width="125"/><Button Name="btnUserDetail" Content="User Komplett" Margin="0,390,37,0" VerticalAlignment="Top" Height="40" Width="126" HorizontalAlignment="Right"/><TextBox Name="tbUserPc" Margin="0,270,37,0" Text="" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Right" Width="125" Height="18"/><TextBox Name="tbUserDetail" Margin="0,367,36,0" Text="" TextWrapping="Wrap" VerticalAlignment="Top" Width="126" HorizontalAlignment="Right" Height="18"/><Canvas VerticalAlignment="Stretch" HorizontalAlignment="Stretch" ><Border Name="searchUserListBorder" BorderBrush="#f3f3f3" Margin="0,0,0,0" Visibility="Collapsed" BorderThickness="1" MinWidth="420"><ListBox  Foreground="Black"  MaxHeight="150" Name="searchUserList" ScrollViewer.HorizontalScrollBarVisibility="Disabled"  ScrollViewer.VerticalScrollBarVisibility="Auto" Margin="-1,0" DisplayMemberPath="{Binding}"><ListBox.ItemTemplate><DataTemplate><TextBlock Text="{Binding ItemData}" TextWrapping="Wrap" FontWeight="Normal" /></DataTemplate></ListBox.ItemTemplate></ListBox></Border></Canvas><TextBox HorizontalAlignment="Left" Margin="112,104,0,0" Text="" TextWrapping="Wrap" Width="120" Height="18" VerticalAlignment="Top"/><Button Name="btnSuchen" Content="Suchen" HorizontalAlignment="Left" Margin="242,103,0,0" VerticalAlignment="Top"/><Button Name="btnWeitersuchen" Content="Weitersuchen" HorizontalAlignment="Left" Margin="293,103,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.177,-0.449" VerticalContentAlignment="Top" HorizontalContentAlignment="Left"/></Grid></Window>"@
#Read the form   
$Reader = (New-Object System.Xml.XmlNodeReader $xaml)   
$Form = [Windows.Markup.XamlReader]::Load($reader) 
#AutoFind all controls   
$xaml.SelectNodes("//*[@*[contains(translate(name(.),'n','N'),'Name')]]") | ForEach-Object {   
    New-Variable -Name $_.Name -Value $Form.FindName($_.Name) -Force   
}


$

$tbUserDetail.Add_TextChanged({
    $searchUserList.Items.Clear()
    #Check for a non-empty list selection
    if($selectionChangedSatus -eq $false -and $selectionChangedSatus -ne $null -and $tbUserDetail.Text -ne ''){
        $QryAllCmd = Get-AdUser -Filter "SamAccountName -like '*$($tbUserDetail.Text)*' -or Name -like '*$($tbUserDetail.Text)*'"  -Properties SamAccountName, Name | Select-Object SamAccountName, Name
        #If user exist in Active Directory then show $WPFsearchUserListBorder and populate $searchUserList
        if($QryAllCmd -ne $null){
            #Add Items to Live Search List
            $searchUserList.Dispatcher.Invoke("Background",[action]{ 
                $QryAllCmd | % {$searchUserList.Items.Add([PSCustomObject]@{'ItemData' = "$($_.Name)"})}
            })
            $searchUserListBorder.Visibility = "Visible"
        }else{
            $searchUserListBorder.Visibility = "hidden"
            $searchUserList.Items.Add([PSCustomObject]@{'ItemData' = "Your search - '$($tbUserDetail.Text)' - did not match any documents."})
        }
    }elseif($tbUserDetail.Text -eq ''){
        $searchUserListBorder.Visibility = "hidden"
    }else{
        #Set $selectionChangedSatus to false when TextChanged occur from SelectionChanged
        $selectionChangedSatus = $false
    }
})

[void]$Form.ShowDialog() 

allerdings wird mir das Fenster/Auswahlmenü nie angezeigt, was mache ich dabei Falsch?

Es existieren auch anderen Funktionen für die anderen Buttons, sind aber meiner Meinung nach nicht relevant für diese Funktion.


verschiedene Textdateien aus einem Ordner zusammen fügen mit Überschrift der entsprechenden TXT-Datei

$
0
0

Hallo Leute :-)

ich bin neu hier und ich weiß nicht 100%ig, ob diese frage in dieser Form schon einmal gestellt wurde.
Ich würde mich freuen, wenn mir jemand helfen könnte. ich habe leider mit PowerShell noch keine Erfahrung machen können und ich habe vielleicht ein spezielles Thema o. Anliegen. Ich habe einen Windows Server 2012R2 und die Frage ist beruflich.

Folgendes:

Ich habe ca. 20 Verzeichnisse mit jeweils einer X-Anzahl an TXT-Dokumenten
Die Verzeichnisnamen (der Ordner) und der Inhalt, die TXT-Dokumente, haben immer denselben Namen und ändern sich nicht.
Im Ordner sind ca. 30 TXT-Dateien, wovon ich 14 TXT-Dateien nur benötige.
Das bleibt aber gleich und ändert sich nicht, wie schon erwähnt.

Bsp:

Ordner Baum
Ordner Tisch
Ordner Stift
Ordner Heft   usw....

In diesen Ordnern befinden folgende TXT-Dateien:

Im Ordner Baum -> grün.txt
                               blau.txt
                               rot.txt   
                               gelb.txt      usw.....
Aufbau TXT:
Normale textwerte, können aber auch Tabellenwerte enthalten.
Da ja der Inhalt kopiert wird, sollte der Aufbau ja nicht verändert werden.

Auf Arbeit sind diese Daten in einer Txt-Datei enthalten.
dies sind unteranderem Code-Logs o. Event-Logs o. anderes.
Wie gesagt, die Ordnernamen ändern sich nicht und die namen der TXT-Dateien ändern sich nicht.
Außer, der Inhalt.

Aufgabe:

ich muss den Inhalt aus den TXT-Dateien (grün, blau, rot, gelb usw...) in eine Txt-Datei zusammen fügen und in ein anderes zentrales Verzeichnis ablegen. Bis dahin wahrscheinlich einfach für Euch :-)

Was ich aber jetzt benötige ist, wenn die TXT-Dateien zusammen gefügt werden, das der Name der angefügten TXT-Datei als Überschrift zur optischen Trennung erscheint.
Sprich, ich habe eine TXT Datei mit dem gesamten Inhalt aller als Beispiel oben genannten Dateien mit einer Überschrift.

Die Überschrift / Trennung inerhalb der Datei ist dann der name der ursprünglichen Datei.

Also, ich habe jetzt 20 TXT-Dateien zusammen gefügt zu einer und suche nach dem Wort: rot.txt.
Dadurch lande ich ja dann an die entsprechende Stelle, wo das rot.txt anfängt.
Oder meinetwegen, wo der inhalt der Event.log anfangen würde.

Das ist mein Ziel oder aktuell ehr der Wunsch.

Ich hoffe, Ihr könnt mir folgen... :-(
Etwas kompliziert zu formulieren.

Ich danke schon einmal vorab und hoffe, es kann mir jemand helfen :-)
Vielen lieben Dank

Compress-Archive + QuellDateien löschen

$
0
0

Hallo,

ich würde gern per PowerShell alle Unterverzeichnisse eines definierten Ordners archivieren. Also so zippen, dass die OrginalDateien und Verzeichnisse nur noch im Archiv vorhanden sind. Kennt jemand einen Schalter für "move". Bei winzip war das -m.

Das zippen funktioniert mit:

$qVerz = "C:\PS\Test\*"
$zVerz = "C:\PS\Archiv\"
Get-ChildItem $qVerz -Directory | %{ Compress-Archive -Path "$($_.Fullname)\*" -DestinationPath "$zVerz$($_.Name)$(get-date -Format _yyyyMMdd).zip" -update}

mit folgendem Befehl könnte ich die ausgewählten Verzeichnisse im Nachgang löschen:

Get-ChildItem $qVerz -Directory | Remove-Item -Force -Recurse

Dabei sehe ich aber das Problem, dass während des Zippens neue Dateien in die Ordner eingefügt werden können die dann beim Renove-Item mit gelöscht werden würden ohne im Archiv zu sein. Das Zippen selbst könnte ja auch auf einen Fehler laufen.....

Gibt es einen Schalter für "move"?

Wenn nicht, gibt es eine Möglichkeit zu fragen ob definierte Dateien im Archiv vorhanden sind? Also erste eine Liste aller Dateien erstellen ...

Get-ChildItem $qVerz -Recurse

... und dann nur die löschen, die im Archiv vorhanden sind.

Danke.

Gruß.

ottto1

Dateiübertragung mit synchronisiertem Ladebalken

$
0
0

Hallo,

ich wollte mir ein Script schreiben, dass die Daten von meinem PC auf einem USB-Stick kopiert. Mein Problem ist, dass es nicht funktioniert und ich nicht weiß warum. Kann mir jemand helfen?

$DataPc = "$HOME\Documents"
$Usb = "D:\"
$Items = (Get-ChildItem $DataPc)
[int]$i = 0
foreach ($file in $Items)
{
    $i++
    $file = $Items[$i]
    Write-Progress -Activity "Safe Data..."  -Status (($Items.Count*$i)/100) -PercentComplete (($Items.Count*$i)/100)
    sleep -Millis 1
    Move-Item -Path $DataPc -Destination $Usb -WhatIf
}
$i = 0
Ich glaube, dass das Problem an...
$file = $Items[$i]

...liegt. Dieser Teil soll eigentlich aus den ganzen Dateien die $i. Datei auswählen.

Ordnerstruktur auf Sharepoint Bibliothek per Powershell Script aus Vorlagen erstellen

$
0
0

Guten Abend zusammen,

leider habe ich bisher keine eindeutige Antwort auf meine Frage erkannt, daher schreibe ich nun selbst. Ich hoffe, jemand kann mir hier helfen.

Wir haben im Büro bislang auf einer örtlichen WD Mycloud Angebote etc. gespeichert. Per Powershell Script konnte man Projekte in einem bestimmten Kundenordner auf der Mycloud speichern. Man hat den Projektnamen eingegeben und seine Initialen und schon wurde alles angelegt. Wir satteln nun auf den Sharepoint um und hier habe ich bereits versucht, per Powershell das Script umzuschreiben.

Ich bin permanent auf officeonline.com angemeldet - Seiten sind als vertrauenswürdig eingestuft. Ebenso habe ich die Bibliothek "Verkauf" als Netzlaufwerk "Z" verbunden. Manuell speichern über den Explorer geht. Allerdings wirft mir Powershell den Fehler "Es wurde kein Positionsparameter gefunden, der das Argument "..." akzeptiert. Ebenso sagt mir Powershell, dass das Laufwerk "Z" nicht existiere - aber ich kann aus dem Explorer heraus dort speichern.

Hier mal der ganze Code:

$foldername = Read-Host "Bitte gib einen Projektnamen ein"
$foldername_kuerzel = Read-Host "Bitte gib dein Kürzel ein"

New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Angebote -type Directory
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Auftrag -type Directory
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Rechnung -type Directory
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Kalkulation -type Directory
Get-Childitem "C:\Users\PMMue\OneDrive\Desktop\Script\Kalkulationsvorlage.xlsm" -recurse | Copy-Item -Destination "Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Kalkulation\"
Rename-Item  "Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Kalkulation\Kalkulationsvorlage.xlsm" -Newname "Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Kalkulation\$foldername-kalkulation.xlsm"
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Planung -type Directory
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Fotos -type Directory
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Einkauf -type Directory
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Partner -type Directory
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Planung\Eventlog -type Directory
Get-Childitem "C:\Users\PMMue\OneDrive\Desktop\Script\vorlage_eventlog.docx" -recurse | Copy-Item -Destination "Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Planung\Eventlog\"
Rename-Item "Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Planung\Eventlog\vorlage_eventlog.docx" -NewName "Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Planung\Eventlog\$foldername-eventlog.docx"
New-Item -Path Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\Planung\Sonstiges -type Directory
start Z:\Freigegebene Dokumente\Interessenten\$foldername_kuerzel-$foldername\

Kann mir jemand einen Tipp geben, was ich ändern muss?

Viele Grüße

Philipp


Prüfen mit welcher Excelversion eine Exceltabelle erstellt wurde

$
0
0

Hallo,

ich müsste Excel-Tabellen die mit dem alten Format .xls erstellt wurden in das Neue .xlsx konvertieren.

Um Fehlermeldungen (die mit OK bestätigt werden müssem) bei Versionen die noch unter Excel 95 erstellt wurden zu vermeiden sollte ich bei jeder Excel-Tabelle die Version ermitteln mit der die Datei erstellt wurde.

Vielleicht gibt es da eine Lösung.

Vielen Danke vorab

Armin

Kein Fehler reine Bequemlichkeit. Bluethooth Audiogerät per Powershell Befehl verbinden.

$
0
0

Hallo Community

Mein Bluethoothfahiger Verstärker schaltet nach wenigen Minuten leerlauf zurecht in den Standby. Das spart zwar Energie ist aber lästig wenn mann jedesmal in die Bluethooth Einstellungen unter Audio muss um dort auf Verbinden zu drücken.

Meine Hoffnung ist nun, dass ich das auch mit einem Powershell Befehl als Script auf dem Desktop erledigen kann. Ich habe schon unet netsh nachgesehen bin aber nicht sonderlich weit gekommen.

Vermutlich lege ich mir das Script dann auf eine Taste. Bequemichkeit halt.

Vielen Dank im Vorraus für eure Hilfe.

Thomas


RegEx / .contains()

$
0
0

Hallo zusammen,

ich habe ein Problem und komme einfach nicht voran egal wie ich es drehe und wende.

Ich habe variable1-x z.B. mit den Namen v_foo_123v_bar_123v_boop_123v_boophoop_123, v_boophoop_234. In einer ForEach Schleife möchte ich den entsprechenden String Value aus einer Hashtabel haben, wenn mein Variabel Name mit dem Key Name im Hashtable übereinstimmt. Das klappt soweit mit einem Where-Object, nur bei v_boophoop_123 und v_boophoop_234 bekomme ich mit einem .contains($_.Key) immer String3 und String4, weil ja beides enthalten ist. Mit einem escaped Regex wo ich den Key einfüge dasselbe, da das wohl im Endeffekt auch die gleiche Funktion wie bei .contains() hat.

Ich habe keine Idee wie ich das z.B. mit nem RexEx Abfragen kann, da die Variabel Namen und Keys immer unterschiedlich sind.

Mein Code:

New-Variable -Name v_foo_123 -Value "Foo Test 123" -Force
New-Variable -Name v_bar_123 -Value "Bar Test 123" -Force
New-Variable -Name v_boop_123 -Value "Boop Test 123" -Force
New-Variable -Name v_boophoop_123 -Value "BoopHoop Test 123" -Force
New-Variable -Name v_boophoop_234 -Value "BoopHoop Test 234" -Force
$hashtable =@{
   foo = "String1"
   bar = "String2"
   boop = "String3"
   boophoop = "String4"
}

$variables = Get-Variable -Name v_*
    ForEach ($var in $variables) 
    {
       #$String= ($hashtable.GetEnumerator() | Where-Object {$var.Name.Substring(2) -match [regex]::Escape($_.Key)}).Value 
       $String= ($hashtable.GetEnumerator() | Where-Object {$var.Name.Substring(2).Contains($_.Key)}).Value
       Write-host $var.Name "->" $String
    }


Der $String ist dann bei v_boophoop_123 und v_boophoop_234 immer String3 und String4. Es sollte aber nur String4 sein, vielleicht kann mir jemand helfen, ich bin mit meinem Latein am Ende. 

Danke und Gruß

André

Powershell AD-Abfrage wird erst beim dritten Versuch richtig ausgeführt

$
0
0

Hallo

Ich habe ein Script erstellt, welches mir Benutzer anzeigt die in einer Speziellen Gruppe nicht vorhanden sind. inkl Auswahlmenü.

# Auswahlmenü erstellen.
function Show-Menu
{
     param (
           [string]$Title = 'Menu'
     )
     cls
     Write-Host "================ $Title ================"
     Write-Host "1: Alle Firmen."
     Write-Host "2: Eine Firma"
     Write-Host "Q: Beenden mit 'Q'."
}

do

# Auswahl Abfrage 
{
     Show-Menu
     $input = Read-Host "Bitte Auswählen"
     switch ($input)
     {
# Alle Klinken OUs werden abgefragt, falls es eine neu OU geben sollte muss die hier eingetragen werden.
           '1' {
                cls
                $OU ="OU=Firma,DC=test,DC=local","OU=Firma2,DC=test,DC=local","OU=Firma3,DC=test,DC=local"

# Alle Mitglieder der Gruppe Grupp1 werden ausgelesen

                $Members = (Get-ADGroup 'Grupp1' -Properties member).member

# Alle Mitglieder der OUs, siehe oben, werden ausgelesen.

                $Users = $OU | ForEach-Object {Get-ADUser -SearchBase $PSItem -Filter * }  

# Die Gruppe Members und Users werden verglichen und die Benutzer die nicht in der Grupp1 sind werden angezeigt.

                Compare-Object -ReferenceObject $Users -DifferenceObject $Members  | Where-Object {$_.SideIndicator -eq '<='} 

# Explisziet Abfrage auf eine Klinik bzw. OU

           } '2' {
                cls
                $OU = Read-Host -Prompt "Bitte OU eingeben. z.b Firma, Firma2, Firma3,."

                $Members = (Get-ADGroup 'Grupp1' -Properties member).member
                $Users = Get-ADUser -Filter *  -SearchBase "OU=$OU,DC=test,DC=local" 
                Compare-Object -ReferenceObject $Users -DifferenceObject $Members  | Where-Object {$_.SideIndicator -eq '<='} 
           } 'q' {
                return
           }
     }


Direkt auf den AD Server funktioniert das Script auch einwandfrei.

Wenn ich aber das Script als Admin in unserer Citrix Umgebung ausführe, habe ich folgendes verhalten.

1) Das Abfragemenu kommt.

2) Ich wähle z.B Punkt 2 aus.

3) Gebe z.B Firma ein.

4) Es wird kein Ergebnis angezeigt 

5) Es erscheint "Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:"  --> mach ich dann und das Menü erscheint        auch wieder.

6) Ich wähle nochmals Punkt 2 aus.

7) Gebe nochmals Firma ein.

8) Das Ergebnis wird jetzt doppelt angezeigt.  z.B:

   CN=User1,OU=Firma,DC=test,DC=local

   CN=User1,OU=Firma,DC=test,DC=local

9) Es erscheint "Drücken Sie die Eingabetaste, um den Vorgang fortzusetzen...:" 

10) Ich wähle nochmals Punkt 2 aus.

11) Gebe nochmals Firma ein.

12) Ergebnis wird Richtig angezeigt.

     CN=User1,OU=Firma,DC=test,DC=local

Hat wer einen Idee, warum das so ist ? Ich komme nicht dahinter.

Danke

Andi-Willi





Dateidownload nach php url Aufruf

$
0
0

Hallo zusammen,

ich bin absoluter Neuling bei Powershell und versuche mir gerade diverse Preislisten von Lieferanten automatisiert herunterzuladen. Bei URLs auf einen direkten Pfad ist das soweit kein Problem, jetzt habe ich jedoch einen Lieferanten wo nach dem Klick auf Preisliste downloaden über ein php Script erst die Liste generiert wird, wie bekomme ich diese automatisch heruntergeladen?

Folgender Ablauf, über mein Script logge ich mich zuerst bei dem Lieferanten ein, was gut funktioniert, dann sehe ich die Seite wo der Button für den Dateidownload sich befindet. Nach klick auf den Downloadbutton wird folgende Beispiel URL geladen und es erscheint das Popup ob ich die Datei öffnen oder speichern möchte.

https://www.test.de/transfer/index.php?action=download&item=deinepreisliste.csv&ordering=name&srt=yes

Nur wie bekomme ich die jetzt mit Powershell ISE heruntergeladen?

Vielen Dank schonmal

Mario

Objekt mit Namen bereits vorhanden

$
0
0

Hallo liebe Powershell Community, ich stehe leider vor einem ärgerlichen Problem. Ich lege in unserem Unternehmen Nutzer per Powershell Script an. Dies funktioniert tadellos, AUßER: Der Name ist bereits vorhanden. Ich verstehe leider nicht so richtig, warum das für Powershell ein Problem ist, denn ich kann ja normal in unser AD gehen und mir dort 15 mal einen Max Mustermann anlegen. Per Script würde aber bereits beim zweiten Mustermann ein Fehler angezeigt werden wie unten auf dem Bild. Kann man diesen Fehler umgehen? Ich poste ganz unten das verwendete Script, falls es Jemanden interessiert.

cls


# LÄD FUNKTION ZUM ÖFFNEN EINES INPUT-FENSTERS
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')



$title = 'Neuer Nutzer'
$msg   = 'Bitte Anrede des neuen Nutzers eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$anrede = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

$title = 'Neuer Nutzer'
$msg   = 'Bitte Nachname des neuen Nutzers eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$name = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

$title = 'Neuer Nutzer'
$msg   = 'Bitte Vorname des neuen Nutzers eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$vorname = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)


$title = 'Neuer Nutzer'
$msg   = 'Bitte Abteilung des neuen Nutzers eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$abtei = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

$title = 'Neuer Nutzer'
$msg   = 'Bitte Position eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$position = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

$title = 'Neuer Nutzer'
$msg   = 'Bitte Titel des neuen Nutzers eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$usertitel = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

$title = 'Neuer Nutzer'
$msg   = 'Art des Mitarbeiters angeben (Arzt, Pflege, Verwaltung, Sonstige):'


# ÖFFNET DAS INPUT-FENSTER

$art = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

$title = 'Neuer Nutzer'
$msg   = 'Bitte Personalnummer eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$persnr = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)

$title = 'Neuer Nutzer'
$msg   = 'Bitte Telefonnummer eingeben:'


# ÖFFNET DAS INPUT-FENSTER

$num = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)


$ReplaceMap = New-Object -TypeName System.Collections.Hashtable
$ReplaceMap['Ä'] = 'Ae'
$ReplaceMap['Ö'] = 'Oe'
$ReplaceMap['Ü'] = 'Ue'
$ReplaceMap['ä'] = 'ae'
$ReplaceMap['ö'] = 'oe'
$ReplaceMap['ü'] = 'ue'
$ReplaceMap['ß'] = 'ss'
$ReplaceMap['é'] = 'e'
$ReplaceMap['è'] = 'e'
$ReplaceMap['á'] = 'a'
$ReplaceMap['à'] = 'a'

$Correct = (Get-Culture).TextInfo
$vorname1 = $vorname
$vorname1 = $Correct.ToTitleCase($vorname1.ToLower())
$ReplaceMap.Keys | % {$vorname1 = $vorname1.Replace($_, $ReplaceMap[$_])}

$name1 = $name
$name1 = $Correct.ToTitleCase($name1.ToLower())
$ReplaceMap.Keys | % {$name1 = $name1.Replace($_, $ReplaceMap[$_])}

$name2=$name1
$vorname2=$vorname1
for($i = 1; $i -le 5; $i++) {

    $account = "$name1.$($vorname1.Substring(0,$i))"
    $user = Get-ADUser -server xxx.xxx.de -Filter "samaccountname -eq '$account'"

    if($user -eq $null){

        write-Host "User $account in Domain 1 NICHT gefunden"
        $user = Get-ADUser -server xxy.xxy.de -Filter "samaccountname -eq '$account'"

        if($user -eq $null){
            write-Host "User $account in Domain 2 NICHT gefunden"
	    break
        }
        else{
            write-Host "User $account in Domain 2 gefunden"
        }
    }
    else{
        write-Host "User $account in Domain 1 gefunden"
    }
}

$account


$check = Get-ADUser -server xxy.xxy.de -Filter "samaccountname -eq '$account'"


#Remove-ADUser $Account -Confirm:$false

if($usertitel){

New-ADUser -Name "$name, $vorname" -Path 'OU=Benutzer,OU=xxx,DC=xxy,DC=xxy,DC=de' -GivenName $vorname -Surname $name -accountPassword (ConvertTo-SecureString -AsPlainText "xxx" -Force) -ChangePasswordAtLogon $true -Enabled $True -City "xxx" -Company 'abc' -Description $abtei -Country 'DE' -DisplayName "$name, $vorname" -SamAccountName $account -ScriptPath "xxx\logon_xxx_komplett.bat" -State "xxx" -StreetAddress "xcv" -OtherAttributes @{'extensionAttribute9'="xxx";'extensionAttribute4'=$account;'extensionAttribute11'=$usertitel;'extensionAttribute14'=$abtei;'extensionAttribute10'=$anrede} -PostalCode "xxx" -HomePage "http://xxx.de" -Department $abtei -PasswordNeverExpires $False -title $position -OfficePhone $num

} else
{
 New-ADUser -Name "$name, $vorname" -Path 'OU=Benutzer,OU=xxx,DC=xxy,DC=xxy,DC=de' -GivenName $vorname -Surname $name -accountPassword (ConvertTo-SecureString -AsPlainText "xxx" -Force) -ChangePasswordAtLogon $true -Enabled $True -City "xxx" -Company 'abc' -Description $abtei -Country 'DE' -DisplayName "$name, $vorname" -SamAccountName $account -ScriptPath "aue\logon_xxx_komplett.bat" -State "xxx" -StreetAddress "xxx" -OtherAttributes @{'extensionAttribute9'="xxx";'extensionAttribute4'=$account;'extensionAttribute14'=$abtei;'extensionAttribute10'=$anrede} -PostalCode "xxx" -HomePage "http://xxx.de/xxx" -Department $abtei -PasswordNeverExpires $False -title $position -OfficePhone $num
}




Start-Sleep -s 2

Get-ADUser $account -prop otherMobile
Set-ADUser $account -Add @{otherMobile=$art}
Get-ADUser $account -prop postOfficeBox
Set-ADuser $account -Add @{postOfficeBox=$persnr}
Get-ADUser $account -prop info
Set-ADUser $account -Add @{info="Mailbox-Aktivierung"}
$user = Get-ADUser -Filter {(sAMAccountname -eq $account)}
#$group = Get-ADGroup "CN=xxx_Benutzer_xxx-xxx,OU=Gruppe,OU=xxx,DC=xxy,DC=xxy,DC=de"
Add-ADGroupMember -identity "xxx_Benutzer_xxy" –Members $user
Add-ADGroupMember -identity "Ordnerumleitung" –Members $user


Set-ADUser $account -UserPrincipalName ("{0}@{1}" -f $account,"xxy.xxy.de")


new-item -path "\\1.1.1.1\xxx$\$account" -ItemType Directory -force -ea stop
new-item -path "\\1.2.1.1\xxb$\$account" -ItemType Directory -force -ea stop



# ADMINISTRATOR WIRD IN ALLEN ORDNERN, UNTERORDNERN UND DATEIEN ZUM BESITZER

$username=”xxx_Server_xxx”
$domain=”xxy”
$rootPath = Join-Path "\\1.2.1.1\e$\home\" -childpath $account
$ID = new-object System.Security.Principal.NTAccount($domain, $username)
$acl = get-acl $rootPath
$acl.SetOwner($ID)
set-acl -path $rootPath -aclObject $acl
Get-ChildItem -Path $rootPath -recurse | set-acl -aclObject $acl

# DEAKTIVIERT DIE VERERBUNG DURCH ÜBERGEORDNETE ORDNER
$acl = Get-ACL $rootPath
$acl.SetAccessRuleProtection($true, $true)
Set-Acl -Path $rootPath -AclObject $acl


# ENTFERNT DIE GRUPPE "xxx-BENUTZER"

$DirectoryPath="\\1.2.1.1\xxx$\$account"
$IdentityRef = "xxx\xxx-Benutzer"  #User oder Group

$ACL = Get-ACL $DirectoryPath
$ACEs=(Get-Acl $DirectoryPath).Access | where {$_.IdentityReference -eq $IdentityRef}
$ACEs | foreach{
    try{
    $null=$ACL.RemoveAccessRule($_)
    Set-ACL $DirectoryPath $ACL
    "ACE für $IdentityRef erfolgreich entfernt"
    }
    catch{
    #keine ACE mehr vorhanden
    }
 }

# GEWÄHRT NUTZER VOLLZUGRIFF AUF HOME

$fullPath = „\\1.2.1.1\xxx$\{0}“ -f $account 

$User = Get-ADUser -Identity $account

if($User -ne $Null) { 
    
    $acl = Get-Acl $fullpath

    $FileSystemRights = [System.Security.AccessControl.FileSystemRights]“FullControl“ 
    $AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow 
    $InheritanceFlags = [System.Security.AccessControl.InheritanceFlags]“ContainerInherit, ObjectInherit“ 
    $PropagationFlags = [System.Security.AccessControl.PropagationFlags]“None“

    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($User.SID, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType) 
    $acl.AddAccessRule($AccessRule)

    Set-Acl -Path $fullpath -AclObject $acl -ea Stop

    }

# GEWÄHRT NUTZER VOLLZUGRIFF AUF SCANS

$fullPath = „\\1.1.2.1\xxx$\{0}“ -f $account 

$User = Get-ADUser -Identity $account

if($User -ne $Null) { 
    
    $acl = Get-Acl $fullpath

    $FileSystemRights = [System.Security.AccessControl.FileSystemRights]“FullControl“ 
    $AccessControlType = [System.Security.AccessControl.AccessControlType]::Allow 
    $InheritanceFlags = [System.Security.AccessControl.InheritanceFlags]“ContainerInherit, ObjectInherit“ 
    $PropagationFlags = [System.Security.AccessControl.PropagationFlags]“None“

    $AccessRule = New-Object System.Security.AccessControl.FileSystemAccessRule ($User.SID, $FileSystemRights, $InheritanceFlags, $PropagationFlags, $AccessControlType) 
    $acl.AddAccessRule($AccessRule)

    Set-Acl -Path $fullpath -AclObject $acl -ea Stop

    }



$account

pause

Custom-Object-Array in Custom-Object-Array: Aktualisierung beschreibt alle Arrays im Array gleichzeitig

$
0
0

Hallo zusammen,

ich stehe vor der Herausforderung ein Script zur Abfrage von Servern zu erweitern. Dafür möchte ich das erst etwas effizienter gestalten, bevor ich neue Funktionen hinzufüge. Dabei bin ich auf ein Phänomen gestoßen, das ich auch in einem wesentlich kleineren Script nachvollziehen, aber nicht lösen kann. Der Code: 

#Kommandos, die ausgeführt werden sollen
$Cmds = @(
          [pscustomobject]@{Nummer = '1'   ;Cmd = {Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff'};Result = ''}
          [pscustomobject]@{Nummer = '2'   ;Cmd = {Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff'};Result = ''}
)

#Platzhalter, der im Original für die abzufragenden Server steht
$Versuche = @(
          [pscustomobject]@{Versuch = '1'    ;Cmds = $Cmds}
          [pscustomobject]@{Versuch = '2'    ;Cmds = $Cmds}
          [pscustomobject]@{Versuch = '3'    ;Cmds = $Cmds}
)

#Die drei Versuche werden nacheinander abgearbeitet.
$Versuche | %{
    $Versuch = $_.Versuch
    $Cmds    = $_.Cmds

    #Bei jedem Versuch werden beide Kommandos (Cmds.Cmd) abgearbeitet
    $Cmds | %{
        $Nummer = $_.Nummer
        $Cmd    = $_.Cmd
        $Result = &$Cmd
        Write-Host "Versuch $Versuch, Nummer $Nummer, Result $Result"
        $_.Result = $Result
        Start-Sleep 1
    }
    Start-Sleep 1
}

$Versuche.Cmds | ft -autosize

Das Ergebnis verwirrt mich:

Versuch 1, Nummer 1, Result 2019-11-06 08:29:43.602
Versuch 1, Nummer 2, Result 2019-11-06 08:29:44.618
Versuch 2, Nummer 1, Result 2019-11-06 08:29:46.618
Versuch 2, Nummer 2, Result 2019-11-06 08:29:47.618
Versuch 3, Nummer 1, Result 2019-11-06 08:29:49.618
Versuch 3, Nummer 2, Result 2019-11-06 08:29:50.618

Nummer Cmd                                        Result                 
------ ---                                        ------                 
1      Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff' 2019-11-06 08:29:49.618
2      Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff' 2019-11-06 08:29:50.618
1      Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff' 2019-11-06 08:29:49.618
2      Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff' 2019-11-06 08:29:50.618
1      Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff' 2019-11-06 08:29:49.618
2      Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff' 2019-11-06 08:29:50.618

Wie man sieht, hat Write-Host nach jedem Kommando und Versuch jeweils eine Sekunde Pause gelassen. Wenn ich das Ergebnis anschließend in Versuche.Cmds betrachte, scheint es, als würden der aktuelle Versuch alle Custom Objects (Cmds) gleichzeitig zu überschreiben. Weiß jemand eine Lösung, wie ich dasselbe Ergebnis erhalte, das mit auch durch Write-Host angezeigt wird?

Schon mal vielen Dank für die Mühe

 Heiko Sattler

Viewing all 2314 articles
Browse latest View live


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