mr.vain
Goto Top

RDS-Farm 2016: Die Anmeldung des Dienstes Gruppenrichtlinienclient ist fehlgeschlagen. Zugriff verweigert

Hallo zusammen,

seit gut einem halben Jahr sind wir von RDS 2012R2 auf RDS 2016 umgestiegen.
Unsere RDS Farm besteht derzeit aus 5 RD-Sitzungshosts und einem RDS-Management-Server (Verbinungsbroker, Gateway, Lizenzierung, WebAccess).
Per GPO sind Umleitungen von Desktop und Co. auf das persönliche Share des Nutzer eingerichtet. Außerdem wird das Roaming-Profile des Nutzers in dem Share "TSProfile$" auf dem File-Server (Server 2012R2) abgelegt, auch eingestellt per Policy.

Nun tritt es häufig auf, dass ab und an bei verschiedenen Nutzenr bei der Anmeldung die Fehlermeldung "Die Anmeldung des Dienstes Gruppenrichtlinienclient ist fehlgeschlagen. Zugriff verweigert" erhalten. Somit ist eine Anmeldung nicht möglich.
Mir ist aufgefallen, dass bei diesen Nutzern die ntuser.dat dann nur 8 kb groß ist. Lösche ich diese ntuser.dat im Profil, dann ist die Anmeldung wieder möglich. Nach Abmeldung wird die ntuser.dat dann auch wieder korrekt ins Servergespeicherte Profil geschrieben.

Auf dem Fileserver ist Deduplizierung deaktiviert. Außerdem habe ich in F-Secure die ntuser.dat als Ausnahme definiert.

Was könnte der Grund sein, dass sich die ntuser.dat bzw. das Profil häufig zerschießt? Dies tritt erst seit dem Wechsel auf Server 2016 auf. Eigentlich ist fast alles analog der RDS-Farm 2012R2 konfiguriert.

Vielleicht habt Ihr ja auch das Problem gehabt und könnt helfen.

Vielen Dank im Voraus!

Gruß

Content-Key: 665910

Url: https://administrator.de/contentid/665910

Printed on: April 26, 2024 at 09:04 o'clock

Member: StefanK2110
StefanK2110 Apr 20, 2021 at 09:07:07 (UTC)
Goto Top
Wir haben bei einem Kunden ein identisches Problem.
Terminalserver Farm mit Server 2016

Fehlermeldung ursprünglich: Anmeldung hängt beim Gruppenrichtliniendienst und bricht ab.
Wir konnten auch eingrenzen, dass die ntuser.dat dann 8kb "klein" ist und haben Volumenschattenkopien aktiviert - so können wir die letzte (funktionierende) Version wiederherstellen.

Wir hatten den Eindruck, dass das Problem existiert, seit die GPO zum Löschen der Profile beim Abmelden aktiviert haben.

Bei unserem Kunden ist Panda AD360 im Einsatz - hier haben wir schon Ausnahmen für die ntuser.dat (und sogar alle .dat-Dateien) definiert.
Keine Besserung.

Der Fehler tritt sporadisch und benutzerunabhängig auf.

Die kaputte ntuser.dat enthält immer nur einen Eintrag - und zwar in
\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon
Der Eintrag ist:
BuildNumber 0x00003839 (14393)

Was mir noch aufgefallen ist: Der Kunde hatte 2 defekte Profile kopiert. In diesen lag jeweils eine ntuser.dat.log1.
In diesen .log1 Dateien lagen jeweils an der gleichen Stelle Einträge, die auch im Text-Editor lesbar waren:
S-1-5-21-2290794699-[...]-[...]23347-1840_AetherAgent_Tmp bzw.
S-1-5-21-2290794699-[...]-[...]23347-1768_AetherAgent_Tmp

Daher hatte ich darauf getippt, dass der Panda AetherAgent hier Schuld wäre - aber das Problem tritt wohl augenscheinlich auch mit anderen Virenscannern auf.

Ich habe nun ein Skript geschrieben, dass alle servergespeicherten Profile durchsucht und ausgibt, wenn ein Profil kleiner als 10KB ist. Dieses will ich nachher noch erweitern, so dass in dem Fall automatisch protokolliert wird, wann das defekte Profil aufgetreten ist und dieses automatisch über VSS wieder hergestellt wird.

Vielleicht lässt sich so auch herausfinden, wann die Datei kaputt geschrieben wird.
Member: Mr.Vain
Mr.Vain Apr 20, 2021 at 09:21:05 (UTC)
Goto Top
Da bin ich ja halbwegs froh, dass wir nicht nur das Problem haben.
Über ein Script habe ich auch schon nachgedacht. Vorallem das mit dem automatischen Hersellen über VSS find ich als Umgangslösung praktikabel. Ist es möglich, dass Du das dann fertige Script veröffentlichst? Ich muss das Rad ja nicht unbedingt neu erfinden... face-smile

Wäre super hilfreich!

Vielen Dank schonmal
Member: StefanK2110
StefanK2110 Apr 20, 2021 at 11:08:57 (UTC)
Goto Top
Wenn es fertig ist, kann ich das machen - es ist aber kein "schönes" Skript und Du musst es dann anpassen (Pfad zum Roaming-Profil).

Löscht ihr die Profile auch bei Abmeldung von den Terminalservern?

Ich habe den Eindruck. dass das Problem erst seit dem Moment existiert, wo wir das eingestellt haben. Vorher war mal hier oder da ein Profil kaputt - aber nur alle paar Monat mal eins.
Member: Mr.Vain
Mr.Vain Apr 20, 2021 at 11:19:59 (UTC)
Goto Top
Es muss auch kein schönes Skript sein. Ein funktionales ist völlig in Ordnung. face-smile

Ja, wir löschen auch die Profile von Terminalservern bei der Abmeldung. Ich kann nicht genau sagen, ob die Probleme deswegen auftreten, weil es halt von Anfang so konfiguriert ist.
Bei RDS 2012R2 war haben wir auch die Profile bei der Abmeldung von TS gelöscht. Da gab es nie ein Problem.
Member: StefanK2110
Solution StefanK2110 Apr 28, 2021, updated at May 05, 2021 at 12:56:18 (UTC)
Goto Top
Hier nun das Skript dass sich als Workaround über die Aufgabenplanung regelmäßig alle 30Minuten ausführe.

Bitte das Log-Verzeichnis vorher anpassen und anlegen - Schreibzugriff muss gegeben sein.
Ebenso das Laufwerk und Verzeichnis für die Roaming-Profile bitte anpassen.
(Ich habe beides hier geändert um jeden Bezug zu unserem Kunden zu entfernen.)

Das Skript wurde nun auch nochmal überarbeitet, da neu angelegte User, die sich das erste mal anmelden zunächst ein Leeres Roamingprofil erhalten und das Skript diese leeren Verzeichnisse als "defektes Profil" erkannt hat. (Ab Zeile 87)

find_damaged_ntuser.ps1:

#Autor:   Stefan Kollmann / SHD
#Version: 1.01
#Stand:   04.05.2021
#
#Aufgabe: Zeigt NTUSER.DAT Dateien und deren Größe aus allen RoamingProfilen an, wenn die NTUSER.DAT weniger als 10kb groß und damit definitiv beschädigt ist
#	  30 minütiger Aufruf über Aufgabenplanung 
#         Erdfassen der Aufrufe und gefundenen defekten Profile in einer LOG Datei, an die ständig nur angefügt wird. 
#         (Später sollen nur noch die gefundenen defekte Protokolliert werden um Platz zu sparen)
#
#Aufruf in der Aufgabenplanung:    Befehl:    c:\windows\system32\WindowsPowerShell\v1.0\powershell.exe
#                                  Argumente: -Executionpolicy Bypass -file "c:\SKRIPTE\find_damaged_ntuser.ps1" -LOGFILE           (Nur ein Beispiel - Anpassen!)  
#
#                                         
#Parameter:  keine
#
#Syntax: find_damaged_ntuser.ps1
#
#
#--------------------------------------------------------------------------

#Log Datei - hier wird immer angehangen (kann sehr groß werden!)
$LOG_File="L:\Logs\damaged_profiles.log"  


#alle Profile liegen unterhalb folgendes Verzeichnisses: (mit abschließendem \ angeben!):
$ProfDrive="P:"  
$ProfPath="\rdprofiles\"  

#Grenze unter der eine ntuser.dat als defekt gilt:
$smaller_is_dead=10000




#LOG-Funktion
function Write_Log
{
Param ([string]$LogStr)

$DateTime = "[{0:dd.MM.yyyy} {0:HH:mm:ss}]" -f (Get-Date)  
$LogDateStr = "$Datetime $LogStr"  

Add-content $LOG_File -value $LogDateStr
write-host $LogStr
}




#Globale Zähler auf Null setzen:
$Count_NumFiles=0

#Statistikarbeit - Startzeit merken
$Startzeit=Get-Date

#Unterordner einlesen:
$Pathlist=Get-ChildItem ($ProfDrive+$ProfPath) -Directory

#Anzahl der Unterordner (entspricht der Profilanzahl) bestimmen
$ProfCount=$Pathlist.Count

#Flag und Variablen für Volumenschattenkopien

#Mountflag setzen
$mountflag=0

#Anzahl der Schattenkopien und deren DeviceObject für die Einbindung abfragen
$NumShadowCopys=(Get-CimInstance -ClassName Win32_ShadowCopy).Count
$Source=((Get-CimInstance -ClassName Win32_ShadowCopy).DeviceObject )

#Index zum Hochzählen der Mountpoints (Verzeichnisname)
$Index_Scopy=0

#Array für die temporären Verzeichnisse für die Mountpoints anlegen
$VSSMountpoint_List = New-Object System.Collections.ArrayList


#Unterordner, also Profile jeweils einzeln behandeln
foreach ($Prof in $Pathlist)
{ 
  #Zur Vereinfachung erstmal den Pfad komplett zusammensetzen:
  $fs_profPath=$ProfDrive+$ProfPath+$Prof;
    
  #Größe der NTUSER.DAT abfragen und ggf. defekte Datei loggen
  $file_to_check=(Get-ChildItem -Path ( $fs_profPath) -Hidden -file "ntuser.dat")  

  $size_of_file=( $file_to_check | measure length -Sum).sum

  #neue Profile abfangen!
  $Flag_neues_Profil = $false;
  if ($file_to_check.Exists -ne $true)
  {  #Prüfen, ob Profilverzeichnis komplett leer ist.
     $files_in_profile  =((Get-ChildItem -Path ( $fs_profPath))|measure).Count
     $Flag_neues_Profil = $files_in_profile -eq 0;
  }

  if (($Flag_neues_Profil -eq $false ) -and ($size_of_file -lt $smaller_is_dead))
  {  
     
     $lastAccessTime = $file_to_check.LastAccessTime
     $lastWriteTime  = $file_to_check.LastWriteTime

     $LogString="Defektes Profil gefunden:    "+$fs_profPath+" ("+$size_of_file+" Byte)   Letzter Zugriff: "+$lastAccessTime+"   Letzte Änderung: "+$lastWriteTime  
     Write_Log $LogString
     Write_Log " "  
     $Count_NumFiles++
     
     #falls nicht gemountet, VSS Verzeichnisse nun einbinden
     if ($mountflag -ne 1)
     {  $mountflag=1
        Write_Log "Binde Volumenschattenkopie-Volumes ein"  
     
        foreach ($Scopy in $Source) 
        { $l= $Scopy.Length
          if ($l -gt 1)
          {
            $Scopy=$Scopy+"\"  
            $Target=("c:\VSS"+$Index_Scopy)  
 
            cmd /c mklink /D $Target $Scopy
            #write-host("Mounte VSS  $Target  nach  $Scopy")  

            #in Liste aufnehmen und Index hochzählen - res könnte man auch verwenden, aber ich mag lieber einfach hochzählen.
            $res=$VSSMountpoint_List.Add($Target)            
            $Index_Scopy = ($Index_Scopy + 1)
          }
        }
        Write_Log("Kurze Wartezeit von 5 Sekunden, damit das System die Verknüpfungen herstellen kann")  
        Write_Log(" ")  
        Start-sleep -s 5
     }

     #Defektes Profil wiederherstellen
     Write_Log("Suche Vorgängerversionen:")  
     
     #Marker: -1 -> Kein Treffer , sonst Index zum Profil mit der ersten ntuser.dat Version die über 8kb groß ist.
     $index_hit=-1
     
     #Pfad zur VSS Kopie der noch intakten ntuser.dat 
     $VSS_RestoreFile_hit=""  

     for ($VSSMountpoint_Index=(($VSSMountpoint_List.Count)-1);$VSSMountpoint_Index -ge 0;$VSSMountpoint_Index--)
     {   $VSSMountpoint_Dir=$VSSMountpoint_List[$VSSMountpoint_Index]
         #write-host("$ind  $di ")  
       
         $fs_VSSprofPath=$VSSMountpoint_Dir+$ProfPath+$Prof;
         # write-host("Durchsuche $fs_VSSprofPath")  
         $VSS_FileToCheck=(Get-ChildItem -Path ( $fs_VSSprofPath ) -Hidden -file "ntuser.dat")  

         $size_of_VSSfile=($VSS_FileToCheck | measure length -Sum).sum
     
         $VSS_lastAccessTime = $VSS_FileToCheck.LastAccessTime
         $VSS_lastWriteTime  = $VSS_FileToCheck.LastWriteTime
         $Restore_Marker=""  
         #nur wenn noch kein Treffer über der grenzwertigen Größe war:
         if ($index_hit -eq -1)
         {   # Prüfen, ob der Treffer interessant ist:
             if ($size_of_VSSfile -ge $smaller_is_dead)
             {  $index_hit=$VSSMountpoint_Index;
                $VSS_RestoreFile_hit=$fs_VSSprofPath
                $Restore_Marker="-> "  
             }
         }
         $LogString=$Restore_Marker+$fs_VSSprofPath+" -> "+$size_of_VSSfile+"     Letzter Zugriff: "+$VSS_lastAccessTime+"   Letzte Änderung: "+$VSS_lastWriteTime  
         Write_Log $LogString
       
     }
     Write_Log " "  
     #Jetzt File wiederherstellen
     if ($index_hit -ge 0)
     {  $VSS_SRC_File=$VSS_RestoreFile_hit  
        $DST_File=$fs_profPath 
        $LogString="Stelle Datei wieder her: robocopy "+$VSS_SRC_File+" "+$DST_File+" ntuser.dat /copyall"       
        Write_Log $LogString
        robocopy $VSS_SRC_File $DST_File ntuser.dat /copyall

     }

  }

}

#Durchlauf beendet - wenn die VSS Mountpoints noch gemountet sind, diese nun wieder entfernen
if ($mountflag -eq 1)
{ Write_Log ("Volumenschattenkopie-Volumes werden abgehangen:")  
  Write_Log " "  
  foreach ($VSSMountpoint in $VSSMountpoint_List)
  {  Write_Log("Entfernte $VSSMountpoint")  
     cmd /c rmdir $VSSMountpoint
  }
  Write_Log " "  
}

#Statistikarbeit - Endzeit merken
$Endzeit=Get-Date

$Zeitspanne=New-TimeSpan -Start $Startzeit -End $Endzeit

$ZeitspanneStunden =$Zeitspanne.Hours
$ZeitspanneMinuten =$Zeitspanne.Minutes+($ZeitspanneStunden*60)
$ZeitspanneSekunden=$Zeitspanne.Seconds


#Statistik ausgeben
Write_Log "Startzeit: $Startzeit    Endzeit: $Endzeit    Dauer: $ZeitspanneMinuten Minuten und $ZeitspanneSekunden Sekunden    $Profcount Profil(e) geprüft - davon defekt: $Count_NumFiles Profil(e)"  


Das erzeugte Log (ich habe ein defektes Profil simuliert) sieht dann in etwa wie folgt aus:

[28.04.2021 11:31:16] Startzeit: 04/28/2021 11:30:49    Endzeit: 04/28/2021 11:31:16    Dauer: 0 Minuten und 26 Sekunden    662 Profil(e) geprüft - davon defekt: 0 Profil(e)
[28.04.2021 12:01:22] Startzeit: 04/28/2021 12:00:14    Endzeit: 04/28/2021 12:01:22    Dauer: 1 Minuten und 8 Sekunden    662 Profil(e) geprüft - davon defekt: 0 Profil(e)
[28.04.2021 12:03:46] Defektes Profil gefunden:    P:\rdprofiles\demo.TESTDOM.V6 (8192 Byte)   Letzter Zugriff: 01/11/2019 17:03:13   Letzte Änderung: 04/20/2021 12:21:15
[28.04.2021 12:03:48]  
[28.04.2021 12:03:48] Binde Volumenschattenkopie-Volumes ein
[28.04.2021 12:03:49] Kurze Wartezeit von 5 Sekunden, damit das System die Verknüpfungen herstellen kann
[28.04.2021 12:03:49]  
[28.04.2021 12:03:54] Suche Vorgängerversionen:
[28.04.2021 12:03:55] -> c:\VSS3\rdprofiles\demo.TESTDOM.V6 -> 1048576     Letzter Zugriff: 01/11/2019 17:03:13   Letzte Änderung: 01/11/2019 17:03:13
[28.04.2021 12:03:55] c:\VSS2\rdprofiles\demo.TESTDOM.V6 -> 1048576     Letzter Zugriff: 01/11/2019 17:03:13   Letzte Änderung: 01/11/2019 17:03:13
[28.04.2021 12:03:55] c:\VSS1\rdprofiles\demo.TESTDOM.V6 -> 8192     Letzter Zugriff: 04/26/2021 17:11:00   Letzte Änderung: 04/20/2021 12:21:15
[28.04.2021 12:03:55] c:\VSS0\rdprofiles\demo.TESTDOM.V6 -> 8192     Letzter Zugriff: 04/26/2021 17:11:00   Letzte Änderung: 04/20/2021 12:21:15
[28.04.2021 12:03:55]  
[28.04.2021 12:03:55] Stelle Datei wieder her: robocopy c:\VSS3\rdprofiles\demo.TESTDOM.V6 P:\rdprofiles\demo.TESTDOM.V6 ntuser.dat /copyall
[28.04.2021 12:04:00] Volumenschattenkopie-Volumes werden abgehangen:
[28.04.2021 12:04:00]  
[28.04.2021 12:04:00] Entfernte c:\VSS0
[28.04.2021 12:04:00] Entfernte c:\VSS1
[28.04.2021 12:04:00] Entfernte c:\VSS2
[28.04.2021 12:04:00] Entfernte c:\VSS3
[28.04.2021 12:04:00]  
[28.04.2021 12:04:01] Startzeit: 04/28/2021 12:03:15    Endzeit: 04/28/2021 12:04:01    Dauer: 0 Minuten und 45 Sekunden    662 Profil(e) geprüft - davon defekt: 1 Profil(e)
Member: Mr.Vain
Mr.Vain Apr 28, 2021 at 17:29:16 (UTC)
Goto Top
Super, vielen Dank dir!!