Ich wurde gerade auf den Remote Desktop Connection Manager von Microsoft aufmerksam gemacht. Es ist eine Verwaltungssoftware für Remotedesktop Verbindungen (RDP) und bietet die Möglichkeit verschiedene RDP Verbindungen nach Gruppen sortiert in einem User Interface darzustellen und Verbindungen per Mausklick zu öffnen. Um diese Nutzen zu können, muss man mit Opsi das Paket rdp-zugriff auf allen Benötigten Clients auszurollen.
Mit dem Manager ist es nun möglich alle Aufgaben, welche lokal am Client per Adminaccout erledigt werden müssen, bequem per Remote Verbindung durchzuführen. Vor allem zur Installation von Programmen ohne Opsi-Pakete kann dies von großem Nutzen sein.
Da die paedML-Linux immer die gleichen Standardcontainer verwendet habe ich daher ein Kleines Skript zusammengestellt, welches die per Schulkonsole angelegte Computerraumstruktur direkt in den Manager importiert. Das Powershell Skript erstellt dann eine Datei "schule.rdg", welche direkt im Manager geöffnet werden kann.Mit dem Manager ist es nun möglich alle Aufgaben, welche lokal am Client per Adminaccout erledigt werden müssen, bequem per Remote Verbindung durchzuführen. Vor allem zur Installation von Programmen ohne Opsi-Pakete kann dies von großem Nutzen sein.
Das Skript verwendet die hier zur Verfügung gestellten Methoden zum Anlegen der Struktur, vielen Dank an den Autor. Zum Ausführen das Skript in die Powershell kopieren und ausführen. Der Dateipfad/Name lässt sich über $pfad anpassen:
$pfad = ".\schule.rdg"Da die Schulstruktur nun angelegt ist kann die erstellte Datei per Doppelklick im Remote Desktop Connection Manager geöffnet werden. Um mehrere Client-PCs verwalten zu können kann es sinnvoll sein zeitweise das Admin Passwort zu hinterlegen. Damit sind die gewünschten PCs nur noch einen Doppelklick von der Verwaltung entfernt. Klicken Sie Dazu mit der rechten Maustaste auf
function New-RDCManFile
{
Param(
[Parameter(Mandatory = $true)]
[String]$FilePath,
[Parameter(Mandatory = $true)]
[String]$Name
)
BEGIN
{
[string]$template = @'
<?xml version="1.0" encoding="utf-8"?>
<RDCMan programVersion="2.7" schemaVersion="3">
<file>
<credentialsProfiles />
<properties>
<expanded>True</expanded>
<name></name>
</properties>
</file>
<connected />
<favorites />
<recentlyUsed />
</RDCMan>
'@
$FilePath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($FilePath)
if(Test-Path -Path $FilePath)
{
Write-Error -Message 'File Already Exists'
}
else
{
$xml = New-Object -TypeName Xml
$xml.LoadXml($template)
}
}
PROCESS
{
$File = (@($xml.RDCMan.file.properties)[0]).Clone()
$File.Name = $Name
$xml.RDCMan.file.properties |
Where-Object -FilterScript {
$_.Name -eq ''
} |
ForEach-Object -Process {
[void]$xml.RDCMan.file.ReplaceChild($File,$_)
}
}
END
{
$xml.Save($FilePath)
}
}
function New-RDCManGroup
{
Param(
[Parameter(Mandatory = $true)]
[String]$FilePath,
[Parameter(Mandatory = $true)]
[String]$Name
)
BEGIN
{
$FilePath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($FilePath)
if(Test-Path -Path $FilePath)
{
$xml = New-Object -TypeName XML
$xml.Load($FilePath)
}
else
{
Write-Error -Exception $_.Exception
throw $_.Exception
}
}
PROCESS
{
$group = $xml.CreateElement('group')
$grouproperties = $xml.CreateElement('properties')
$groupname = $xml.CreateElement('name')
$groupname.set_InnerXML($Name)
$groupexpanded = $xml.CreateElement('expanded')
$groupexpanded.set_InnerXML('False')
[void]$grouproperties.AppendChild($groupname)
[void]$grouproperties.AppendChild($groupexpanded)
[void]$group.AppendChild($grouproperties)
[void]$xml.RDCMan.file.AppendChild($group)
}
END
{
$xml.Save($FilePath)
}
}
function New-RDCManServer
{
Param(
[Parameter(Mandatory = $true)]
[String]$FilePath,
[Parameter(Mandatory = $true)]
[String]$GroupName,
[Parameter(Mandatory = $true)]
[String]$Server,
[Parameter(Mandatory = $true)]
[String]$DisplayName
)
BEGIN
{
$FilePath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($FilePath)
if(Test-Path -Path $FilePath)
{
$xml = New-Object -TypeName XML
$xml.Load($FilePath)
}
else
{
Write-Error -Exception $_.Exception
throw $_.Exception
}
}
PROCESS
{
$ServerNode = $xml.CreateElement('server')
$serverproperties = $xml.CreateElement('properties')
$servername = $xml.CreateElement('name')
$servername.set_InnerXML($Server)
$serverdisplayname = $xml.CreateElement('displayName')
$serverdisplayname.set_InnerXML($DisplayName)
[void]$serverproperties.AppendChild($servername)
[void]$serverproperties.AppendChild($serverdisplayname)
[void]$ServerNode.AppendChild($serverproperties)
$group = @($xml.RDCMan.file.group) | Where-Object -FilterScript {
$_.properties.name -eq $groupname
}
[void]$group.AppendChild($ServerNode)
}
END
{
$xml.Save($FilePath)
}
}
New-RDCManFile -FilePath $pfad -Name Schule
New-RDCManGroup -FilePath $pfad -Name "Admin"
New-RDCManServer -FilePath $pfad -DisplayName "AdminVm" -Server "AdminVm" -Group "Admin"
[ADSI]$domain = "LDAP://CN=raeume,CN=groups,OU=schule, DC=paedml-linux,DC=lokal"
$alleGruppen = ($domain.Children.distinguishedName | ForEach-Object {[ADSI]"LDAP://$_"}).cn
foreach($gruppe in $alleGruppen){
New-RDCManGroup -FilePath $pfad -Name $gruppe
$pcsInGruppe = (New-Object System.DirectoryServices.DirectoryEntry((New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=Group)(name=$($gruppe)))")).FindOne().GetDirectoryEntry().Path)).member | % { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } | Sort-Object sAMAccountName | SELECT @{name="User Name";expression={$_.Name}},@{name="User sAMAccountName";expression={$_.sAMAccountName}}
foreach($client in $pcsInGruppe){
write-host $client.'User Name' "wird zu" $gruppe "hinzugefügt"
$client = $client.'User Name'
New-RDCManServer -FilePath $pfad -DisplayName $client -Server $client -Group $gruppe
}
}
"Schule" --> "Properties"
Dort wählen Sie die Logon Credentials, deaktivieren "Inherit..." und können nun das Passwort hinterlegen und mit OK bestätigen. Über "File" --> "save schule.rdg" kann das Passwort (verschlüsselt) auch auf dauer in der Datei hinterlegt werden.
Wenn Sie mit dem Administrieren der Remote-PCs fertig sind kann es sinnvoll sein das Passwort an dieser Stelle wieder zu entfernen, da diese Datei den Zugriff auf alle Client-PCs der Schule ermöglicht.