Wichtigste Erkenntnisse
- Automatisierte Erstellung von Verknüpfungen: Dieses PowerShell-Skript automatisiert die Erstellung von RDP-Verknüpfungen, spart Zeit und reduziert manuelle Fehler.
- Anpassbare Optionen: Es bietet umfangreiche Anpassungsmöglichkeiten, einschließlich bezüglich der Anzeigeeinstellungen, Benutzeranmeldeinformationen und Gateway-Konfigurationen.
- Skalierbarkeit für große Umgebungen: Ideal für MSPs und IT-Abteilungen, die mehrere Remote-Verbindungen verwalten.
- Erfordern von Administratorrechten: Erfordert für bestimmte Vorgänge Administratorrechte, um die Sicherheit zu gewährleisten.
- Konfliktmanagement: Enthält Prüfungen auf widersprüchliche Optionen, die Benutzer:innen zur optimalen Konfiguration führen.
- Sicherheitsbewusst: Priorisiert die sichere Handhabung von Anmeldeinformationen und Bereitstellung von Verknüpfungen.
- Gesteigerte Produktivität: Optimiert den Prozess der Remote-Desktop-Verwaltung und steigert dadurch die IT-Produktivität insgesamt.
- Ergänzende Tools: Kann effektiv mit Verwaltungsplattformen wie NinjaOne für umfassende IT-Lösungen kombiniert werden.
RDP-Verknüpfungen (Remote Desktop Protocol) sind wichtige Tools in der IT-Welt, die eine nahtlose Verbindung zu Remote-Systemen ermöglichen. Mit der Entwicklung vernetzter Umgebungen und dem wachsenden Bedarf an effizientem Fernzugriff wird die Möglichkeit, diese Verknüpfungen schnell zu erstellen und zu verwalten, unerlässlich. Dieses in PowerShell erstellte Skript bietet einen optimierten, anpassbaren Ansatz zur Erstellung von RDP-Verknüpfungen und steigert die Produktivität von IT-Experten und Managed Service Providern (MSPs).
Hintergrund und Bedeutung des PowerShell-Skripts
Bisher war die Erstellung und Verwaltung von RDP-Verknüpfungen mit manuellen Prozessen verbunden, was insbesondere in großen oder dynamischen IT-Umgebungen zeitaufwändig und fehleranfällig sein kann. Dieses PowerShell-Skript löst diese Herausforderung, indem es die Erstellung von Remote-Desktop-Verknüpfungen mit benutzerdefinierten Parametern automatisiert. Eine solche Automatisierung ist besonders für IT-Teams von Vorteil, die mehrere Remote-Verbindungen verwalten, sowie für Systemhäuser, die ihren Kunden schnell Fernzugriffslösungen bereitstellen müssen.
Das Skript zur Automatisierung der Erstellung von Remote-Desktop-Verknüpfungen
<# .SYNOPSIS This script will create an rdp desktop shortcut with your specified options. It can create a shortcut for all users (including new ones) or existing ones only. .DESCRIPTION This script will create an rdp desktop shortcut with your specified options. It can create a shortcut for all users (including new ones) or existing ones only. .EXAMPLE To Create a windowed RDP Shortcut simply specify the size, the name of the shortcut and which users the shortcut is for. You can also specify "MultiMon" for multi-monitor support. Or a gateway to use. PS C:> ./Create-DesktopShortcut.ps1 -Name "Test" -RDPTarget "SRV19-TEST" -RDPUser "TESTjsmith" -Width "1920" -Height "1080" -AllExistingUsers -ExcludeUsers "ChrisWashington,JohnLocke" Creating Shortcut at C:UsersJohnSmithDesktopTest.rdp .PARAMETER NAME Name of the shortcut ex. "Login Portal". .PARAMETER RDPtarget IP Address or DNS Name and port to the RDS Host ex. "TEST-RDSH:28665". .PARAMETER RDPuser Username to autofill in username field. .PARAMETER AlwaysPrompt Always Prompt for credentials. .PARAMETER Gateway IP Address or DNS Name and port of the RD Gateway ex. "TESTrdp.example.com:4433". .PARAMETER SeperateGateWayCreds If the RDS Gateway uses different creds than the Session Host use this parameter. .PARAMETER FullScreen RDP Shortcut should open window in 'FullScreen' mode. .PARAMETER MultiMon RDP Shortcut should open window with Multi-Monitor Support enabled. .PARAMETER Width Width of RDP Window should open ex. "1920". .PARAMETER Height Height of RDP Window shortcut should open ex. "1080". .PARAMETER AllExistingUsers Create the Shortcut for all existing users but not new users ex. C:Users*Desktopshortcut.lnk. .PARAMETER ExcludeUsers Comma seperated list of users to exclude from shortcut placement. .PARAMETER AllUsers Create the Shortcut in C:UsersPublicDesktop. .OUTPUTS None .NOTES Minimum OS Architecture Supported: Windows 7, Windows Server 2008 Release Notes: Renamed script, Split script into three, added Script Variable support, fixed bugs in RDP Shortcut By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use. Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA). #> [CmdletBinding()] param ( [Parameter()] [String]$Name, [Parameter()] [String]$RDPtarget, [Parameter()] [String]$RDPuser, [Parameter()] [Switch]$AlwaysPrompt = [System.Convert]::ToBoolean($env:alwaysPromptForRdpCredentials), [Parameter()] [String]$Gateway, [Parameter()] [Switch]$SeparateGateWayCreds = [System.Convert]::ToBoolean($env:separateRdpGatewayCredentials), [Parameter()] [Switch]$FullScreen, [Parameter()] [Switch]$MultiMon, [Parameter()] [Int]$Width, [Parameter()] [Int]$Height, [Parameter()] [Switch]$AllExistingUsers, [Parameter()] [Switch]$AllUsers ) begin { # Replace existing params with form variables if they're used. if ($env:shortcutName -and $env:shortcutName -notlike "null") { $Name = $env:shortcutName } if ($env:createTheShortcutFor -and $env:createTheShortcutFor -notlike "null") { if ($env:createTheShortcutFor -eq "All Users") { $AllUsers = $True } if ($env:createTheShortcutFor -eq "All Existing Users") { $AllExistingUsers = $True } } if ($env:rdpServerAddress -and $env:rdpServerAddress -notlike "null") { $RDPtarget = $env:rdpServerAddress } if ($env:rdpUsername -and $env:rdpUsername -notlike "null") { $RDPuser = $env:rdpUsername } if ($env:rdpGatewayServerAddress -and $env:rdpGatewayServerAddress -notlike "null") { $Gateway = $env:rdpGatewayServerAddress } if ($env:rdpWindowSize -and $env:rdpWindowSize -notlike "null") { if ($env:rdpWindowSize -eq "Fullscreen Multiple Monitor Mode") { $MultiMon = $True } if ($env:rdpWindowSize -eq "Fullscreen") { $FullScreen = $True } } if ($env:customRdpWindowWidth -and $env:customRdpWindowWidth -notlike "null") { $Width = $env:customRdpWindowWidth } if ($env:customRdpWindowHeight -and $env:customRdpWindowHeight -notlike "null") { $Height = $env:customRdpWindowHeight } # Output warnings for conflicting options. if (($Width -and -not $Height ) -or ($Height -and -not $Width)) { Write-Warning "You forgot to include both the width and height. RDP Window will be in fullscreen mode." } if (($Width -or $Height) -and ($FullScreen -or $MultiMon)) { if ($MultiMon) { Write-Warning "Conflicting Display Option selected. Using Fullscreen Multi-monitor." } else { Write-Warning "Conflicting Display Option selected. Using Fullscreen." } } # Double-check that a user is specified for shortcut creation. if (-not $AllUsers -and -not $AllExistingUsers -and -not $User) { Write-Error "You must specify which desktop to create the shortcut on!" exit 1 } # Double-check that a shortcut name was provided. if (-not $Name -or -not $RDPtarget) { Write-Error "You must specify a name and target for the shortcut!" exit 1 } # Creating a shortcut at C:UsersPublicDesktop requires admin rights. function Test-IsElevated { $id = [System.Security.Principal.WindowsIdentity]::GetCurrent() $p = New-Object System.Security.Principal.WindowsPrincipal($id) $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) } if (!(Test-IsElevated)) { Write-Error -Message "Access Denied. Please run with Administrator privileges." exit 1 } # Retrieve all registry paths for actual users (excluding system or network service accounts). function Get-UserHives { param ( [Parameter()] [ValidateSet('AzureAD', 'DomainAndLocal', 'All')] [String]$Type = "All", [Parameter()] [String[]]$ExcludedUsers, [Parameter()] [switch]$IncludeDefault ) # User account SIDs follow a particular pattern depending on whether they're Azure AD, Domain, or local "workgroup" accounts. $Patterns = switch ($Type) { "AzureAD" { "S-1-12-1-(d+-?){4}$" } "DomainAndLocal" { "S-1-5-21-(d+-?){4}$" } "All" { "S-1-12-1-(d+-?){4}$" ; "S-1-5-21-(d+-?){4}$" } } # We'll need the NTuser.dat file to load each users registry hive. So we grab it if their account sid matches the above pattern. $UserProfiles = Foreach ($Pattern in $Patterns) { Get-ItemProperty "HKLM:SOFTWAREMicrosoftWindows NTCurrentVersionProfileList*" | Where-Object { $_.PSChildName -match $Pattern } | Select-Object @{Name = "SID"; Expression = { $_.PSChildName } }, @{Name = "UserHive"; Expression = { "$($_.ProfileImagePath)NTuser.dat" } }, @{Name = "UserName"; Expression = { "$($_.ProfileImagePath | Split-Path -Leaf)" } }, @{Name = "Path"; Expression = { $_.ProfileImagePath } } } # In some cases, it's necessary to retrieve the .Default user's information. switch ($IncludeDefault) { $True { $DefaultProfile = "" | Select-Object UserName, SID, UserHive, Path $DefaultProfile.UserName = "Default" $DefaultProfile.SID = "DefaultProfile" $DefaultProfile.Userhive = "$env:SystemDriveUsersDefaultNTUSER.DAT" $DefaultProfile.Path = "C:UsersDefault" $DefaultProfile | Where-Object { $ExcludedUsers -notcontains $_.UserName } } } $UserProfiles | Where-Object { $ExcludedUsers -notcontains $_.UserName } } } process { $ShortcutPath = New-Object System.Collections.Generic.List[String] # Create the filenames for the path. if ($RDPTarget) { $File = "$Name.rdp" } # Build the paths and add them to the ShortcutPath list. if ($AllUsers) { $ShortcutPath.Add("$env:PublicDesktop$File") } if ($AllExistingUsers) { $UserProfiles = Get-UserHives # Loop through each user profile $UserProfiles | ForEach-Object { $ShortcutPath.Add("$($_.Path)Desktop$File") } } if ($User) { $UserProfile = Get-UserHives | Where-Object { $_.Username -like $User } $ShortcutPath.Add("$($UserProfile.Path)Desktop$File") } $RDPFile = New-Object System.Collections.Generic.List[String] # Base template of an .RDP file. Additional options will be appended based on user selection. $Template = @" session bpp:i:32 compression:i:1 keyboardhook:i:2 audiocapturemode:i:0 videoplaybackmode:i:1 connection type:i:7 networkautodetect:i:1 bandwidthautodetect:i:1 displayconnectionbar:i:1 enableworkspacereconnect:i:0 disable wallpaper:i:0 allow font smoothing:i:0 allow desktop composition:i:0 disable full window drag:i:1 disable menu anims:i:1 disable themes:i:0 disable cursor setting:i:0 bitmapcachepersistenable:i:1 audiomode:i:0 redirectprinters:i:1 redirectcomports:i:0 redirectsmartcards:i:1 redirectwebauthn:i:1 redirectclipboard:i:1 redirectposdevices:i:0 autoreconnection enabled:i:1 authentication level:i:2 negotiate security layer:i:1 remoteapplicationmode:i:0 alternate shell:s: shell working directory:s: gatewaycredentialssource:i:4 gatewaybrokeringtype:i:0 use redirection server name:i:0 rdgiskdcproxy:i:0 kdcproxyname:s: enablerdsaadauth:i:0 "@ $RDPFile.Add($Template) # This will generate the actual .rdp file $ShortcutPath | ForEach-Object { $RDPFile.Add("full address:s:$RDPTarget") $RDPFile.Add("gatewayhostname:s:$Gateway") if ($Width) { $RDPFile.Add("desktopwidth:i:$Width") } if ($Height) { $RDPFile.Add("desktopheight:i:$Height") } if ($MultiMon) { $RDPFile.Add("use multimon:i:1") }else { $RDPFile.Add("use multimon:i:0") } if ($FullScreen -or $MultiMon -or !$Height -or !$Width) { $RDPFile.Add("screen mode id:i:2") }else { $RDPFile.Add("screen mode id:i:1") } if ($AlwaysPrompt) { $RDPFile.Add("prompt for credentials:i:1") }else { $RDPFile.Add("prompt for credentials:i:0") } if ($Gateway) { $RDPFile.Add("gatewayusagemethod:i:2") }else { $RDPFile.Add("gatewayusagemethod:i:4") } if ($SeparateGateWayCreds) { $RDPFile.Add("promptcredentialonce:i:0") $RDPFile.Add("gatewayprofileusagemethod:i:1") } else { $RDPFile.Add("promptcredentialonce:i:1") if ($Gateway) { $RDPFile.Add("gatewayprofileusagemethod:i:0") } } if ($RDPUser) { $RDPFile.Add("username:s:$RDPUser") } Write-Host "Creating Shortcut at $_" $RDPFile | Out-File $_ if (!(Test-Path $_ -ErrorAction SilentlyContinue)) { Write-Error "Unable to create Shortcut at $_" exit 1 } } exit 0 }end { }
Greifen Sie auf über 300 Skripte im NinjaOne Dojo zu.
Erklärung des Skripts: Eine schrittweise Aufschlüsselung
Das Skript beginnt mit einer Zusammenfassung und einer Beschreibung, die einen klaren Überblick über die Funktionalität des Skripts geben. Anschließend werden Parameter festgelegt, einschließlich des Namens der Verknüpfung, des RDP-Zielservers, der Anmeldeinformationen vom Benutzer, der Anzeigeoptionen, (Vollbild oder Unterstützung mehrerer Monitore), und der Möglichkeit, Verknüpfungen für alle oder bestimmte Benutzer:innen zu erstellen.
- Definition der Parameter: Das Skript definiert verschiedene Parameter, mit denen die RDP-Verknüpfung angepasst werden kann. Dazu gehören grundlegende Details wie der Name der Verknüpfung, das RDP-Ziel und der Benutzer sowie erweiterte Optionen wie die Fenstergröße, die Unterstützung mehrerer Monitore und die Gateway-Konfiguration.
- Umgebungsvariablen und Konfliktprüfung: Das Skript überprüft die Parameter und ersetzt sie durch Umgebungsvariablen, falls vorhanden. Es gibt auch Warnmeldungen aus, wenn sich die Optionen widersprechen, zum Beispiel wenn sowohl Vollbild als auch Fenstergröße angegeben werden.
- Handhabung von Administratorrechten und Benutzerprofilen: Das Skript enthält eine Funktion zur Überprüfung der Administratorrechte, die für die Erstellung von Verknüpfungen in bestimmten Verzeichnispfaden erforderlich sind. Es enthält auch eine Funktion zum Abrufen von Benutzerprofilen, mit Ausnahme von Systemkonten, was für die Bereitstellung von Verknüpfungen zu bestimmten Benutzer-Desktops entscheidend ist.
- Prozess der Erstellung von Verknüpfungen: Das Skript generiert die .RDP-Datei, indem es die vom Benutzer ausgewählten Optionen an eine Basisvorlage anhängt. Anschließend werden die ermittelten Verknüpfungspfade durchlaufen und die RDP-Datei an jedem Ort erstellt.
Potenzielle Anwendungsfälle: Eine Anwendung aus der Praxis
Stellen Sie sich einen MSP vor, der für die Verwaltung des Fernzugriffs für ein Unternehmen mit mehreren Abteilungen verantwortlich ist, die jeweils spezifische RDP-Konfigurationen benötigen. Mit diesem Skript kann der MSP schnell angepasste RDP-Verknüpfungen für jede Abteilung generieren und diese effizient auf den jeweiligen Benutzer-Desktops bereitstellen, wodurch die manuelle Einrichtungszeit erheblich reduziert wird.
Vergleichende Analyse: Skript vs. traditionelle Methoden
Im Vergleich zur manuellen Erstellung von RDP-Verknüpfungen bietet dieses Skript erhebliche Vorteile in Bezug auf Skalierbarkeit, Anpassbarkeit und Fehlerreduzierung. Während manuelle Methoden für einzelne Setups ausreichen mögen, werden sie in größeren, dynamischeren Umgebungen unpraktisch, wo dieses Skript mühelos komplexe Konfigurationen verwalten kann.
Häufig gestellte Fragen
- Kann das Skript unterschiedliche Anmeldeinformationen für RDP und Gateway verarbeiten?
Ja, es enthält einen Parameter für separate Gateway-Anmeldeinformationen. - Ist es möglich, bestimmte Benutzer:innen auszuschließen?
Das Skript ermöglicht den Ausschluss bestimmter Benutzer:innen vom Erhalt der Verknüpfung. - Wie gewährleistet das Skript die Sicherheit?
Es erfordert Administratorrechte und verwaltet sorgfältig die Anmeldeinformationen von Benutzer:innen.
Auswirkungen und Sicherheitsüberlegungen
Obwohl dieses Skript die Erstellung von Remote-Desktop-Verknüpfungen erheblich vereinfacht, müssen die Auswirkungen auf die Sicherheit berücksichtigt werden. Der ordnungsgemäße Umgang mit Anmeldeinformationen und die Sicherstellung, dass Verknüpfungen nur für autorisierte Benutzer:innen bereitgestellt werden, sind entscheidende Aspekte. Darüber hinaus sollten MSPs die Konfigurationen von Verknüpfungen regelmäßig überprüfen, um die Sicherheitsstandards aufrechtzuerhalten.
Best Practices für die Verwendung des Skripts
- Gründliche Prüfung: Testen Sie das Skript vor dem weit verbreiteten Einsatz gründlich in einer kontrollierten Umgebung.
- Regelmäßige Updates: Halten Sie das Skript bei Änderungen der Netzinfrastruktur auf dem neuesten Stand.
- Sicherheitskontrollen: Überprüfen Sie regelmäßig den Einsatz von Verknüpfungen auf Sicherheitsschwachstellen.
Schlussfolgerung: Verbessertes Remote-Desktop-Management mit NinjaOne
Zusammenfassend lässt sich sagen, dass dieses PowerShell-Skript ein leistungsstarkes Tool zum Erstellen und Verwalten von RDP-Verknüpfungen ist, das Anpassungen und Effizienz bietet. Tools wie NinjaOne ergänzen solche Skripte, indem sie eine einheitliche Plattform für die Verwaltung vom IT-Betrieb, einschließlich Remote-Desktop-Verbindungen, bereitstellen und dadurch IT-Verwaltungsaufgaben rationalisieren und die allgemeine Produktivität sowie Sicherheit in Remote-Arbeitsszenarien verbessern.