Ich benötigte Informationen, die sich in den AD-Benutzerinformationen auf der Registerkarte „Remote Desktop Services Profile“ befinden, die den „Profile Path:“ des Benutzers, den RDS „Local Path“ und das Laufwerk inkl. Pfad des „Home Folder“ im Netzwerk angeben (siehe Abbildung unten).
Bild folgt…
Ich wollte ebenfalls prüfen, ob der in diesem Bildschirm angegebene Pfad erreicht werden kann, so dass der Befehl Test-Path zu diesem Zweck verwendet werden kann. Wenn dieser nicht benötigt wird, kann dieser natürlich auch auskommentiert werden.
Es stellte sich heraus, dass der Befehl Get-ADUser mir diese Informationen nicht liefern konnte, und nach einiger Suche stellte sich dann heraus, dass dies Abfrage über ADSI geschehen musste.
Da nicht zwingend alle Benutzer einen „Home-Folder“ eingegeben haben, kann der Befehl Test-Path zu Fehlern führen, und ich wollte protokollieren, welche Benutzerkonten diese Art von Fehlern verursachten, also fügte ich ein Start-Transkript hinzu, um alle Ausgaben des Skripts zu protokollieren. Außerdem wollte ich diese Informationen in eine CSV-Datei exportieren, also fügte ich am Ende ein Export-CSV hinzu (mit einem „;“ als Trennzeichen, da dies das Standardtrennzeichen für Excel in meinem Land ist).
Wenn ich die Daten über ADSI abrufe, möchte ich die Informationen für folgende Felder prüfen:
TerminalServicesProfilePfad
TerminalServicesHomeDirectory
TerminalServicesHomeDrive
Sie müssen den Searchbase-Teil in diesem Befehl ändern, um die Benutzer aus der OU in Ihrer Domäne abzurufen (es werden nur die Informationen für aktivierte Konten in der angegebenen OU abgerufen):
Get-ADUser -Filter {Enabled -eq $true} -SearchBase ‚OU=UsersOU,DC=contoso,DC=com‘
Das gesamte Skript wird zu:
Start-Transcript $PSScriptRoot\GetRemoteDesktopServicesProfileInformation.txt
$Results = @()
Get-ADUser -Filter {Enabled -eq $true} -SearchBase 'OU=UsersOU,DC=domain,DC=com' | ForEach {
$UserInfo = [ADSI]"LDAP://$($_.distinguishedName)"
Write-Host ("Prosessing {0}" -f $_.distinguishedName)
$Prop = @{
SamAccountname = $_.Samaccountname
TSProfilePath = $UserInfo.TerminalServicesProfilePath
TSHomeDirectory = $UserInfo.TerminalServicesHomeDirectory
TSHomeDrive = $UserInfo.TerminalServicesHomeDrive
PathTestOk = Test-Path -Path $UserInfo.TerminalServicesHomeDirectory
}
$Result = New-Object -TypeName PSObject -Property $Prop
$Results += $Result
}
$Results | Export-Csv $PSScriptRoot\RDSI.csv -Delimiter ";" -NoTypeInformation
Stop-Transcript
Wenn man die ganze Domäne prüfen möchte, kann man das Skript wie folgt abändern:
$DomainDN = (Get-ADDomain).DistinguishedName
Start-Transcript $PSScriptRoot\GetRemoteDesktopServicesProfileInformation.txt
$Results = @()
Get-ADUser -Filter {Enabled -eq $true} -SearchBase $DomainDN | ForEach {
$UserInfo = [ADSI]"LDAP://$($_.distinguishedName)"
Write-Host ("Prosessing {0}" -f $_.distinguishedName)
$Prop = @{
SamAccountname = $_.Samaccountname
TSProfilePath = $UserInfo.TerminalServicesProfilePath
TSHomeDirectory = $UserInfo.TerminalServicesHomeDirectory
TSHomeDrive = $UserInfo.TerminalServicesHomeDrive
PathTestOk = Test-Path -Path $UserInfo.TerminalServicesHomeDirectory
}
$Result = New-Object -TypeName PSObject -Property $Prop
$Results += $Result
}
$Results | Export-Csv $PSScriptRoot\RDProfile.csv -Delimiter ";" -NoTypeInformation
Stop-Transcript
Um z. B. für Berechtigungen eine neue Gruppe „GruppeB“ mit den selben Mitgliedern wie „GruppeA“ zu erstellen, kann folgendes Skript verwendet werden:
Definieren Sie den Namen der Quell- und Zielgruppe
$sourceGroupName = „GruppeA“
$targetGroupName = „GruppeB“
# in welche OU soll die neue Gruppe erstellt werden?
$ZielOU = „OU=Groups,DC=example,DC=com“
Abrufen der Mitglieder der Quellgruppe
$sourceGroupMembers = Get-ADGroupMember -Identity $sourceGroupName
Überprüfen, ob die Zielgruppe existiert. Wenn nicht, erstellen Sie sie.
if (-not (Get-ADGroup -Filter {Name -eq $targetGroupName})) {
New-ADGroup -Name $targetGroupName -GroupScope Global -Path $ZielOU -Description „Beschreibung der Zielgruppe“
}
Hinzufügen der Mitglieder zur Zielgruppe
foreach ($member in $sourceGroupMembers) {
Add-ADGroupMember -Identity $targetGroupName -Members $member
}
Write-Output „Mitglieder der Gruppe $($sourceGroupName) wurden erfolgreich zur Gruppe $($targetGroupName) hinzugefügt.“
# Liste der DNS-Namen, die aufgelöst werden sollen
$dnsNames = @(
"example.com",
"example2.com",
"example3.com"
)
foreach ($dnsName in $dnsNames) {
try {
$ipAddresses = [System.Net.Dns]::GetHostAddresses($dnsName) | Select-Object -ExpandProperty IPAddressToString
Write-Host "IP-Adressen für $dnsName "
foreach ($ip in $ipAddresses) {
Write-Host "- $ip"
}
} catch {
Write-Host "Fehler beim Auflösen des DNS-Namens $dnsName $_"
}
}
Die Reservierung aller Scopes exportieren:
$dhcpserver = "QuellServer.QuellDomain.com"
Get-DhcpServerv4Scope -ComputerName $dhcpserver | Get-DhcpServerv4Reservation -ComputerName $dhcpserver Export-Csv "pathtofile\ScopeReservation.csv" -Encoding UTF8 -Force -NoTypeInformation -Delimiter ";"
Als nächstes importieren wir die Reservierungen (ACHTUNG!: nicht mit Import, sondern mit Add)
$dhcpserver = "ZielServer.ZielDomain.com"
$scopes = Import-Csv -Path "pathtofile\ScopeReservation.csv" -Delimiter ";"
foreach ($scope in $scopes)
{
$name = $scope.name
$description = $scope.description
Write-Output "Creating scope $name"
Add-DhcpServerv4Reservation -ComputerName $dhcpserver -ScopeId $scope.ScopeId -IPAddress $scope.IPAddress -Description $scope.description -Name $scope.name -ClientId $scope.clientid -Type $scope.Type #-WhatIf
}
Aufgrund eines Firmenkaufs, mussten die DHCP Scopes eines Windows DHCP Server auf einen bereits bestehenden transferiert werden. Da die Standard Backup/Import Funktion die bestehende Konfiguration überschreiben würde, habe ich hierzu PowerShell genutzt:
Export der bestehenden Konfiguration:
$dhcpserver = "QuellServer.QuellDomain.com" Get-DhcpServerv4Scope -ComputerName $dhcpserver | Export-Csv "pathtofile\dhcpscopes.csv" -Encoding UTF8 -Force -NoTypeInformation
Import der Konfiguraton auf den Quellserver:
$dhcpserver = "ZielServer@ZielDomain.com"
$scopes = Import-Csv -Path "pathtofile\dhcpscopes.csv" -Delimiter ";"
foreach ($scope in $scopes)
{
$name = $scope.name
$description = $scope.description
Write-Output "Creating scope $name"
Add-DhcpServerv4Scope -ComputerName $dhcpserver -Name "$name" -Description "$description" -StartRange $scope.startrange -EndRange $scope.endrange -SubnetMask $scope.subnetmask -State Active
}
Wie die ScopeOptions und Reservierungen übernommen werden zeige ich in einem weiteren Beitrag.
Comment : This script updates AD users attributes from excel sheet.
Version : 1.1
This command has been added to script.
[threading.thread]::CurrentThread.CurrentCulture = ‚en-US‘
#
Declare file path and sheet name
$credential=Get-Credential
$ErrorActionpreference = „continue“
[threading.thread]::CurrentThread.CurrentCulture = ‚de-DE‘
$file = „C:\Path\TEST.xlsx“
Create an Excel.Application instance and open that file
$Excelobject = New-Object -ComObject Excel.Application
$Workbook = $Excelobject.Workbooks.Open($file)
$sheetName = „Tabelle1“
$sheet = $Workbook.Worksheets.Item($sheetName)
$objExcel.Visible=$true
Count max row
$rowMax = ($sheet.UsedRange.Rows).count
Count max column
$colMax = ($sheet.UsedRange.Columns).count
$hash = @{}
$server = „DC01.company.com“
Specify starting positions
$row,$col = 1,1
$updatedCount = 0
loop for rows
for ($i=1; $i -le $rowMax-1; $i++)
{
#loop for columns
for($c=0; $c -le $colMax-1; $c++)
{
#Get all columns values to a hash
$hash += @{$sheet.Cells.Item($row,$col+$c).text = $sheet.Cells.Item($row+$i,$col+$c).text}
}
#Create an object and assign hash keys as object property
$Object = New-Object -TypeName PSObject -Property $hash
#Get User via SamAccountname
$user = Get-ADUser -Filter {„SamAccountName -eq ‚$($Object.sAMAccountName)'“} -Server $server -Credential $credential
#Set Users attribute with matched object attribute
$user | Set-ADUser -GivenName $Object.GivenName -Surname $Object.SN
-DisplayName $Object.Displayname -OfficePhone $Object.PhoneNumber
# -Description $Object.Description -Country $Object.Country
-Office $Object.Office -Title $Object.Title
-Company $Object.Company -Department $Object.Department
-Manager $Object.Manager `
-Mobile $Object.Mobile
#-Fax $Object.Fax
#If you want to edit Object common name, you can remove enable two lines below.
#$userguid = $user.ObjectGUID.Guid
#$user | Rename-ADObject -NewName $Object.DisplayName -Server $server -Credential $credential
$hash = @{}
Write-Host $User.Name „- User attributes have been updated.“ -ForegroundColor Yellow
Start-Sleep -s 1
$updatedCount += 1
}
Write-Host $updatedCount „Users have been updated“ -ForegroundColor Green
close excel file
$Excelobject.quit()
Mit diesem PowerShell Befehl werden abgelaufene Computer Zertifikate aufgelistet:
Continue reading »
Neueste Kommentare