Laden...

Zugriff auf die Values von Active Directory Property "userParameters"

Erstellt von netsport vor 7 Jahren Letzter Beitrag vor 7 Jahren 5.061 Views
N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren
Zugriff auf die Values von Active Directory Property "userParameters"

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

16.842 Beiträge seit 2008
vor 7 Jahren

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");
N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

Hi,

sehe ich es richtig, dass wenn ich mit GetUnderlyingObject arbeiten möchte, die Principal Klasse verwenden muss?

Danke und Gruss
netsport

16.842 Beiträge seit 2008
vor 7 Jahren

Ä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.

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

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

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

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

1.040 Beiträge seit 2007
vor 7 Jahren

Einfach auf das Symbol mit dem Bezeichner C# klicken. =)

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

Na das ist ja einfach, wenn man die Symbole erkennt 😉
Vielen Dank!

D
985 Beiträge seit 2014
vor 7 Jahren

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

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

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

16.842 Beiträge seit 2008
vor 7 Jahren

Und welche Methode genau wirft die Exception?

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

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

16.842 Beiträge seit 2008
vor 7 Jahren

Und was sagt

lowerLdap.Properties["msTSProfilePath"]

?

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

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

1.696 Beiträge seit 2006
vor 7 Jahren

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

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

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?

1.696 Beiträge seit 2006
vor 7 Jahren

Im Grunde genommen ist es ziemlich egal, wo sich die Datei lokal befindet.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

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