Hallo,
im Windows AD gibt es eine Benutzereigenschaft mit dem Namen userParameters.
Bei dieser Eigenschaft handelt es sich nach einigem googeln wohl um ein Binary Large Object, in dem u.a. der Terminalserverprofilpfad gespeichert wird.
Kann mir jemand bitte einen Hinweis geben, wie ich auf die Daten dieser Eigenschaft zugreifen (lesen/schreiben) kann?
Danke und Grüsse
netsport
Wenn Du auf die Werte einfach zugreifen willst, dann kannst Du die Invoke-Methoden von DirectoryEntry verwenden, also zB:
DirectoryEntry entry= ( user.GetUnderlyingObject( ) as DirectoryEntry );
entry.InvokeSet("TerminalServicesProfilePath", "pfad hier");
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
sehe ich es richtig, dass wenn ich mit GetUnderlyingObject arbeiten möchte, die Principal Klasse verwenden muss?
Danke und Gruss
netsport
Ähm... 🤔
DirectoryEntry ist halt das Basis Element, mit dem das Principal arbeitet.
Wenn Du direkt mit DirectoryEntry arbeitest, dann haste logischerweise kein UnderlyingObject.
Woher das Entry-Objekt kommt spielt ja keine Rolle.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
ich habe bis jetzt folgenden Code gebaut.
Macht vielleicht deutlicher, weshalb ich Frage.
string[] domainComponent = Domain.GetComputerDomain().ToString().Split('.');
string ldapPath = "";
for (int i = 0; i <= domainComponent.Length - 1; i++ )
{
ldapPath += ",DC=" + domainComponent[i];
}
DirectoryEntry dE = null;
try
{
dE = new DirectoryEntry("LDAP://OU=User" + ldapPath);
}
catch (Exception ex)
{
Debug.WriteLine("Error: " + ex.Message);
}
DirectorySearcher dS = null;
try
{
dS = new DirectorySearcher(dE);
}
catch (Exception ex)
{
Debug.WriteLine("Error: " + ex.Message);
}
dS.Filter = "(&(objectCategory=user)(objectCategory=person))";
dS.PageSize = 500;
SearchResultCollection sRC = null;
try
{
sRC = dS.FindAll();
}
catch (Exception ex)
{
Debug.WriteLine("Error: " + ex.Message);
}
Debug.WriteLine(sRC.Count);
try
{
Hashtable propertyvalues = new Hashtable();
foreach (SearchResult sR in sRC)
{
foreach (string property in sR.Properties.PropertyNames)
{
ResultPropertyValueCollection rPVC = sR.Properties[property];
u.s.w.
Wenn ich nun "nur" die Terminalserverproperties ermitteln und ändern möchte, muss ich dann zusätzlich ein Principal Objekt, ein PrincipalSearcher Objekt u.s.w. erstellen? Also quasi alles, was ich bereits mit dem Directoryentry gemacht habe?
Sollte mein Code Fehler enthalten oder Best Practices fehlen, wäre eine Info klasse. Die Kommentare füge ich später ein 😃
Danke und Grüsse
netsport
Und direkt die nächste Frage.
Wie bindet man hier C# Code richtig ein?
Einfach Copy and Paste, wie ich es gemacht habe, ist wohl eher der falsche Weg.
Danke
netsport
Einfach auf das Symbol mit dem Bezeichner C# klicken. =)
Und wenn man bei dem Beitrag auf editieren drückt, dann kann man sogar den Beitrag editieren - um z.B. eine fehlende Code-Formatierung zu ergänzen
Hallo,
ich versuche immer noch, die Terminalserverkonfiguration zu ermitteln.
Wenn ich folgenden Code ausführe, erhalte ich die Errormeldung.
"Unbekannter Name. (Ausnahme von HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))"
Stimmt der Name nicht oder mache ich etwas anderes falsch?
...
foreach (UserPrincipal result in search.FindAll())
{
if (result.Name == "TestUser")
{
DirectoryEntry lowerLdap = (DirectoryEntry)result.GetUnderlyingObject();
var TSPath = lowerLdap.InvokeGet("TerminalServicesProfilePath").ToString();
}
}
...
Vielen Dank.
Grüsse
netsport
Und welche Methode genau wirft die Exception?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo,
die InvokeGet Methode wirft den Fehler.
Google hat mir mitgeteilt, dass der Name seit Server 2008 msTSProfilePath lautet. Damit funktioniert es aber auch nicht.
Danke und Grüsse
netsport
Und was sagt
lowerLdap.Properties["msTSProfilePath"]
?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi,
bei
lowerLdap.Properties["msTSProfilePath"]
kommt eine PropertyValueCollection zurück.
Im Debugger enthält diese Collection die Property msTSProfilePath mit der Value null (empty)
Grüsse
netsport
Hallo,
das Problem ist, dass MS zwar sagt, dass ab Windows 2008 die TSProfile-Daten dahin verlagern werden soll, jedoch tut MS das nicht, man findet bisher nie was in diesen Properties. Der einzige Weg TSProfile-Daten zu bearbeiten geht zurzeit nur über Tsuserex.dll, d.h. wenn du nicht direkt auf einem Server OS (2008 und später) entwickelst, muss du diese DLL zu deiner Entwicklungsmaschine kopieren, mit regsvr32 registrieren, danach im Projekt-Verweis einbinden, die Liste der Interfaces findest du hier: IADsTSUserEx interface
**:::
Hi,
ich habe die Datei TSuserex.dll auf meinem PC im Ordner
c:\Windows\winsxs\amd64_microsoft-windows-t..vices-userextension_31bf3856ad364e35_6.1.7601.17514_none_50f0c6dafa05fecc
gefunden.
Registriert man diese in diesem Ordner oder muss das File erst nach System32 kopiert und dann registriert werden?
Im Grunde genommen ist es ziemlich egal, wo sich die Datei lokal befindet.
**:::
Hi,
so, jetzt läuft es.
Ich habe die tsuserex.dll vom WinServer auf meinen lokalen WinPC kopiert und anschliessend registriert.
foreach (UserPrincipal result in search.FindAll())
{
DirectoryEntry lowerLdap = (DirectoryEntry)result.GetUnderlyingObject();
IADsTSUserEx adsiUser = (IADsTSUserEx)lowerLdap.NativeObject;
Debug.WriteLine(adsiUser.TerminalServicesProfilePath);
}
Mit der lokalen tsuserex.dll funktionierte es nicht.
Dank an alle Unterstützer.
netsport