Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[C#/ASP] AD Tool

Pagina: 1
Acties:

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 11:57
Ben een beetje aan het knutselen met een AD Tool.
Deze tool moet users in een bepaalde group kunnen knallen en natuurlijk ook uitlezen.
Ook een totaal overzicht van alle users in AD moet deze op kunnen halen.

Het ophalen van users, werkt, prima zelfs.
Het toevoegen van een user in een group, dat is een ander verhaal.

Ik gebruik hiervoor de DirectoryServices, daarbinnen een LDAP string voor de verbinding met AD.
Dit alles test ik op een VM waarop zowel mijn Visual Studio als AD staat, en hierop log ik in met een user welke Enterprise Admin is binnen AD.

De code die ik gebruik (of probeer te gebruiken) voor een user aan AD toe te voegen is als volgt.
Er is op de site een listbox waarin alle users staan, daarin selecteer je een user en drukt op toevoegen.
Verder is er een list (Users) waarin alle gebruikers staat welke ik daarvoor op AD heb gehaald.
Deze is opgebouwd als:
samaccountname|achternaam voornaam
Daarna loop ik eerst door de list heen met alle users, en als de naam welke in de listbox stond, overeenkomt met de naam na het | karakter probeert hij deze toe te voegen.

De error die ik krijg is lekker generiek, en het enige wat ik eruit kan halen is dat het een userprobleem is:
An operations error occurred.
Iemand enig idee hoe en wat?
Edit:
Zojuist achter gekomen dat die op zijn bek gaat op deGroup.Properties["member"].Add(li.Remove(li.IndexOf('|')));

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void AddUser()
        {
            string name = ListBox1.SelectedItem.Text;

            foreach (string li in Users)
            {
                if(ListBox1.SelectedItem.Text == li.Remove(0, (li.IndexOf('|') + 1)))
                {
                    try
                    {
                        DirectoryEntry deGroup = new DirectoryEntry(string.Format("LDAP://{0}/CN=<group>", Environment.MachineName));



                        //deGroup.Username = string.Format("{0}\\<user>", Environment.MachineName);
                        //deGroup.Username = "<user>";
                        //deGroup.Password = "<password>";


                        deGroup.Properties["member"].Add(li.Remove(li.IndexOf('|')));
                        deGroup.CommitChanges();
                        deGroup.Close();
                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }

                }
            }

        }

  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 12:00
Nou heb ik al een tijdje geen C# meer geprogrameerd, maar:
C#:
1
2
3
4
catch (Exception ex) 
{ 
    throw new Exception(ex.Message); 
} 

Lijkt mij uit den boze, dan gooi je 90% van je informatie weg. Haal die try/catch lekker weg of vervang het door de overbodige
C#:
1
2
3
4
catch (Exception ex) 
{ 
    throw ex; 
}

En dan denk ik dat je al heel veel meer informatie te zijn krijgt over je crash. Niet dat je stacktrace je veel kan vertellen in dit verhaal waarschijnlijk maar alles is meegenomen natuurlijk.

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 11:57
Even gedaan, precies hetzelfde

DirectoryServicesCOMException
{"An operations error occurred.\r\n"}

Stacktrace wordt ik nog steeds niet veel wijzer van.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Staat er niet toevallig iets in je windows eventlog?

https://niels.nu


  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 11:57
Yep, exact hetzelfde als mijn exception binnen VS

Event code: 3005
Event message: An unhandled exception has occurred.
Event time: 11/1/2012 1:21:53 PM
Event time (UTC): 11/1/2012 12:21:53 PM
Event ID: 6250d1d43cc14ff08a23178054dddc0f
Event sequence: 78
Event occurrence: 1
Event detail code: 0

Application information:
Application domain: 23c7bca5-5-129962460699843750
Trust level: Full
Application Virtual Path: /
Application Path: C:\Users\<user>\Documents\Visual Studio 2010\Projects\<project>\<project>\
Machine name: <server>

Process information:
Process ID: 3972
Process name: WebDev.WebServer40.exe
Account name: <domain>\<user>

Exception information:
Exception type: DirectoryServicesCOMException
Exception message: An operations error occurred.

at <project>.<page>.AddUser() in C:\Users\<user>\Documents\Visual Studio 2010\Projects\<project>\<project>\<page>.aspx.cs:line 158
at <project>.<page>.btnAdd_Click(Object sender, EventArgs e) in C:\Users\<user>\Documents\Visual Studio 2010\Projects\<project>\<project>\<page>.aspx.cs:line 169
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Request information:
Request URL: http://localhost:5680/<page>.aspx
Request path: /<page>.aspx
User host address: 127.0.0.1
User: <domain>\<user>
Is authenticated: True
Authentication Type: NTLM
Thread account name: <domain>\<user>

Thread information:
Thread ID: 4
Thread account name: <domain>\<user>
Is impersonating: False
Stack trace: at <project>.<page>.AddUser() in C:\Users\<user>\Documents\Visual Studio 2010\Projects\<project>\<project>\<page>.aspx.cs:line 158
at <project>.<page>.btnAdd_Click(Object sender, EventArgs e) in C:\Users\<user>\Documents\Visual Studio 2010\Projects\<project>\<project>\<page>.aspx.cs:line 169
at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)


Custom event details:

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 20-11 13:38

sopsop

[v] [;,,;] [v]

Heb je .net 3.5? Gebruik dan de System.DirectorServices.AccountManagement namespace.

Dan voeg je een user zo toe aan een groep (code komt van MSDN):

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PrincipalContext ctx = new PrincipalContext(ContextType.Domain,                                                                     
                                            "fabrikam.com",                                                                             
                                            "DC=fabrikam,DC=com",                                                               
                                            "administrator", 
                                            "SecretPwd123");
        
GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, 
                                                   IdentityType.Name, 
                                                   "Domain Admins");

if (grp != null)
{
    grp.Members.Remove(ctx, IdentityType.Name, "John Smith");          
    grp.Members.Add(ctx, IdentityType.Name, "Jim Daly");
    grp.Save();
    grp.Dispose();
}
ctx.Dispose();

[ Voor 4% gewijzigd door sopsop op 01-11-2012 13:45 ]


  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 11:57
het .net framework staat er wel op, applicatie wordt ook gecompileerd op .net 4.0
Echter heb ik alleen directoryservices en daaronder alleen nog activedirectory.

Had namelijk ook al naar Principalcontext zitten kijken, helaas zit dat er dus niet in.

en .net 3.5 erbij knallen geeft me toch een partij aan moeilijkheden :(

[ Voor 12% gewijzigd door tha_crazy op 01-11-2012 14:11 ]


  • Styxxy
  • Registratie: Augustus 2009
  • Laatst online: 10:31
Sleepkever schreef op donderdag 01 november 2012 @ 13:15:
Lijkt mij uit den boze, dan gooi je 90% van je informatie weg. Haal die try/catch lekker weg of vervang het door de overbodige
C#:
1
2
3
4
catch (Exception ex) 
{ 
    throw ex; 
}

En dan denk ik dat je al heel veel meer informatie te zijn krijgt over je crash. Niet dat je stacktrace je veel kan vertellen in dit verhaal waarschijnlijk maar alles is meegenomen natuurlijk.
Doe het dan ineens goed en doe "throw;", anders gooi je ook nog de stacktrace weg. Dit is zowat een van de vaakst voorkomende fouten bij het doorgooien van exceptions...

[ Voor 10% gewijzigd door Styxxy op 01-11-2012 15:57 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
tha_crazy schreef op donderdag 01 november 2012 @ 13:47:
het .net framework staat er wel op, applicatie wordt ook gecompileerd op .net 4.0
Echter heb ik alleen directoryservices en daaronder alleen nog activedirectory.

Had namelijk ook al naar Principalcontext zitten kijken, helaas zit dat er dus niet in.
Heb je wel de juiste reference / using toegevoegd? (Of staat je applicatie misschien op client-profile terwijl 't daar niet in zit?). Het is geheid 1 van deze twee zaken.

Afbeeldingslocatie: http://tweakers.net/ext/f/w7oHw9fZsIVUt7WlELJFuA7I/full.png
C#:
1
using System.DirectoryServices.AccountManagement;


edit:

Zit ik helemaal screenshots te maken heb je 't al uitgevogeld :( :P

[ Voor 17% gewijzigd door RobIII op 01-11-2012 16:13 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 11:57
Zojuist met ff wat hulp inderdaad ff mijn eigen voor lul gezet, nu is principlecontext wel beschikbaar.

Error: No principal matching the specified parameters was found.
C#:
1
2
3
4
5
6
                        using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, Environment.MachineName))
                        {
                            GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "<group>");
                            group.Members.Add(pc, IdentityType.UserPrincipalName, li.Remove((li.IndexOf('|') + 1)));
                            group.Save();
                        }


Edit:
Denk dat dit komt omdat ik het op SAM Account name doe, ff gewijzigt.

Edit2
@#$(*$(^@()#^ :(
Access denied

[ Voor 10% gewijzigd door RobIII op 01-11-2012 16:18 . Reden: We hoeven de goden er niet bij te betrekken ;) ]


  • Sleepkever
  • Registratie: Juni 2007
  • Laatst online: 12:00
Styxxy schreef op donderdag 01 november 2012 @ 15:57:
[...]

Doe het dan ineens goed en doe "throw;", anders gooi je ook nog de stacktrace weg. Dit is zowat een van de vaakst voorkomende fouten bij het doorgooien van exceptions...
offtopic:
Heb al een tijdje geen C# meer aangeraakt maar wel veel Java (waar throw ex; dus wel juist is) Je hebt helemaal gelijk 8)7

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 11:57
Haha ja net iets te laat RobIII.
Maar mijn PincipalContext werk wel qua selecten, echter, save gooit die nog steeds een access is denied error op.
Ondertussen even de user die ik ervoor gebruik ook maar even hard full-access gegeven tot de OU waar die op moet saven, werkt het godver nog voor geen ene meter!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 11:57
Oke, en hij doet het.
ContextOptions stond op Negotiate.
Overgeknalt naar SimpleBind en toen deed die het wel.

C#:
1
2
3
4
5
6
7
                        string samname = li.Remove((li.IndexOf('|')));
                        using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, Environment.MachineName, null, ContextOptions.SimpleBind, "<domain>\\<user>", "<password>"))
                        {
                            GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "<group>");
                            group.Members.Add(pc, IdentityType.SamAccountName, samname);
                            group.Save();
                        }
Pagina: 1