.NET: DirectoryEntry naar lokale machine

Pagina: 1
Acties:

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11 20:41
Ik ben een programma aan het maken die vanuit de registry automatisch wordt opgestart en een aantal zaken controleert.

Een van de eerste dingen is of de huidige user (domain user) lid is van de lokale administrators. Zoniet, moet de user aan de lokale administrators worden toegevoegd.

Om het netjes te doen, wandel ik eerst door de members van de groep Administrators heen, om te kijken of de user erin staat:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim Local, LocalGroup, LocalGroupMemberEntry As DirectoryEntry

Local = New DirectoryEntry("WinNT://" & Environment.MachineName & ",computer")

If Not Local.Children.Find("Administrators", "group") Is Nothing Then
    LocalGroup = Local.Children.Find("Administrators", "group")
    LocalGroupMembers = LocalGroup.Invoke("Members", Nothing)

    If Not LocalGroupMembers Is Nothing Then
        For Each LocalGroupMember As Object In LocalGroupMembers
            LocalGroupMemberEntry = New DirectoryEntry(LocalGroupMember)

            If LocalGroupMemberEntry.Name = UserName Then
                Exists = True
            End If
        Next
    End If
End If


Als ik de members bekijk van de Administrators group (lokaal) zijn dat:

- Administrator
- DOMAIN\Domain Admins
- DOMAIN\Pietje
- SomeLocalUser

Het rare is nu... als ik de lokale Directory uitlees, zonder een username/pass op te geven aan het DirectoryEntry object, dan krijg ik 4 Members terug (zoals je zou verwachten)... maar, omdat de user die deze applicatie gaat uitvoeren mogelijk geen lid is van de lokale administrators, wil ik bij het maken van een connectie naar de lokale Directory een username/pass opgeven:

Local.Username = "Administrator"
Local.Password = "Password"

Op zich werkt dit wel.. maar ik krijg dan uit de lokale Administrators groep maar 1 user terug, namelijk de lokale Administrator. De beide domain accounts krijg ik niet terug en ook de SomeLocalUser niet. Verder loopt het programma wel netjes door, maar de constatering of de domain user reeds lid is van de lokale administrators klopt dus niet. Hierdoor gaat het invoken van "Add" even verderop onderuit.

Haal ik de username en pass weer weg, dan krijg ik wel weer 4 accounts terug uit de lokale Administrators, maarja, dan heb ik verderop weer een probleem, want de user die dan het programma uitvoert mag mogelijk geen users toevoegen...

Heeft iemand een idee waarom het resultaat van .Invoke("Members") in het ene geval juist is (4 members) en in het andere geval maar 1 member terug geeft ??

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Waarom ga je zo tewerk ? Waarom ga je eerst alle members van een group gaan ophalen om dan te zien of de huidige user in dat lijstje voorkomt ?
Kan je niet gewoon checken of de huidige user lid is van een group ? (memberof property bv van een ADSI query)

https://fgheysels.github.io/


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11 20:41
whoami schreef op vrijdag 04 mei 2007 @ 09:48:
Kan je niet gewoon checken of de huidige user lid is van een group ? (memberof property bv van een ADSI query)
Via DirectoryEntry is dit volgens mij niet mogelijk. Ik kan een children.find doen, maar zoiets werkt niet op een object van het type 'group', enkel op OU's zeg maar (het vind de child objecten, niet de members in een group).

Voor zover ik weet is DirectoryServices (dus ook DirectoryEntry) gebaseerd op ADSI, maar dan managed (ADSI is COM?). Toch kan ik geen MemberOf property vinden van een DirectoryEntry :(

Ik zou het liefst geen gebruiken maken van COM

edit: hmm, er zou wel iets van een IsMember method moeten zijn voor Invoke, met als parameter de domain user. Dit zou dan een boolean moeten returnen. Wel nettere code natuurlijk, ff proberen.

PS. blijf het wel vreemd vinden dat het invoken van Members in de beide situaties een ander resultaat geeft, zonder verdere errors. Ik vraag me dan toch af wat de logica hierachter is, zodat ik dit in de toekomst niet fout zou doen :P

[ Voor 24% gewijzigd door Mephix op 04-05-2007 10:06 ]


  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11 20:41
code:
1
2
3
4
5
6
7
8
9
10
11
If Not Domain.Children.Find(UserName, "user") Is Nothing Then
    DomainUser = Domain.Children.Find(UserName, "user")

    If Not Local.Children.Find("Administrators", "group") Is Nothing Then
        LocalGroup = Local.Children.Find("Administrators", "group")

        If LocalGroup.Invoke("IsMember", New Object() {DomainUser.Path.ToString}) = False Then
            LocalGroup.Invoke("Add", New Object() {DomainUser.Path.ToString})
        End If
    End If
End If


blijf ik het probleem houden dat ik de lokale accounts wel terug krijg, maar de domain users die lid zijn van de lokale administrators niet ;(

  • Mephix
  • Registratie: Augustus 2001
  • Laatst online: 25-11 20:41
volgende code heeft hetzelfde rare probleem:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void CheckUser()
{
    DirectoryEntry DomainEntry = null;
    DirectoryEntry LocalEntry = null;
    DirectoryEntry User = null;
    DirectoryEntry Group = null;
    Boolean result = false;

    try
    {
        DomainEntry = new DirectoryEntry("WinNT://DOMAIN,domain");
        LocalEntry = new DirectoryEntry("WinNT://workstation,computer");

        User = DomainEntry.Children.Find("mephix", "user");
        Group = LocalEntry.Children.Find("Administrators", "group");

        result = (bool)Group.Invoke("IsMember", new object[] {User.Path.ToString()});
    }
    catch (Exception)
    {
        result = false;
    }
}


Als ik de code op deze manier schrijf, lijkt het goed te gaan... het gaat fout als ik het domein als "domain.nl" invul. Dit lijkt te komen door de Path.ToString. Deze returned namelijk een andere waarde afhankelijk van wat je als domeinnaam invult. WinNT:\\domain.nl\user of WinNT:\\DOMAIN\user. De eerste wordt door de IsMember niet gevonden, de 2e wel. Het liefst zou ik dan ook IsMember op guid doen oid in plaats van User.Path... maar dat heb ik nog niet voor elkaar.