Weiterlesen: Abrufen von AD „Remote Desktop Services Profile“ informationen


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
}
Getagged mit: 
Alle Scope Optionen exportieren:
Get-DhcpServerv4Scope -ComputerName "QuellServer.QuellDomain.com" | Export "pathtofile\exportScopeOptions.csv" -Delimiter ";"

Da in dieser Tabelle alle Scope Optionen wie Rounter, DNS Server in einer Spalte stehen, habe ich mit einem Excel Filter diese in separate Spalten aufgetrennt und jeweils nach dem ScopeOptionNamen benannt. Zum Beispiel Router;DNSServer usw. .

Import der Scope Optionen:

$dhcpserver = "ZielServer.ZielDomain.com"
$scopes = Import-Csv -Path "pathtofile\exportScopeOptions.csv" -Delimiter ";"
foreach ($scope in $scopes)
{
    $name = $scope.name
    $description = $scope.description
Write-Output "Creating scope  $name"
Set-DhcpServerv4OptionValue -Router $scope.router -DNSServer $scope.DNSServer -ScopeId $scope.scopeid -ComputerName $dhcpserver
}

Wie die DHCP Reservierungen exportiert und importiert werden, zeige ich in einem neuen Blogbeitrag.

Getagged mit: 

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.
Getagged mit: 
 
 

Bulk AD Update durch Excel Datei

On 21. Dezember 2021, in Allgemein, Von

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()

 

Abgelaufene Computer Zertifikate finden

On 20. Dezember 2021, in PowerShell, Von

Mit diesem PowerShell Befehl werden abgelaufene Computer Zertifikate aufgelistet:

Continue reading »

Getagged mit: