Misslyckades med lite Java-programmering (för att hämta aktuellt username) så jag tänkte kompensera detta med lite misslyckad ASP.NET programmering. ;) Ha särskilt i åtanke att jag är nybörjare, så felet kan vara väldigt trivialt. Tips till nästa gång: Se till att skicka med felmeddelanden, det underlättar felsökning enormt mycket. Stort tack för att Du tog Dig tid att analysera & svara, Oskar! :) Det kan den absolut, du kan också skapa en list med din struct.. t.ex.Rookiefråga ang klasser/structs och instansiering/initiering variabler
Tanken är att jag skulle vilja ha två klasser "ADuser" som motsvarar en enskild "Active Directory user" samt "ADusers" som skall vara en klass som delvis innehåller en array med "ADuser".
När jag kör koden så tycker den inte jag instansierat "_ADuser" i klassen "ADusers". Den första klassen "ADuser" fungerar trots spagettiprogrammeringen.. :))
TACKSAM FÖR HJÄLP som Ni säkert förstår.. /Per O.
ADuser:
public string _username;
public string _ort;
public string _namn;
public int _status;
public string _user_kmt;
public string _admin_kmt;
public string _logg;
public bool _found;
ADusers:
public int[] _ID;
public ADuser[] _ADuser;
public bool _found;
public int _no_users;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.DirectoryServices;
/// <summary>
/// Summary description for ADusers
/// </summary>
public class ADuser
{
public string _username;
public string _ort;
public string _namn;
public int _status;
public string _user_kmt;
public string _admin_kmt;
public string _logg;
public bool _found;
public ADuser()
{
}
public ADuser(string username)
{
//
// Construct
//
_username = "";
_ort = "";
_namn = "";
_user_kmt = "";
_admin_kmt = "";
_logg = "";
_status = -1;
_found = false;
//
// Get single user
//
_found = false;
if (username == null)
{
_logg = "Ingen användare medskickad till rutinen ADuser";
}
DirectoryEntry entryRoot = new DirectoryEntry("LDAP://RootDSE");
string domain = (string)entryRoot.Properties["defaultNamingContext"][0];
string domainpath = "LDAP://mydomain.local";
DirectoryEntry searchRoot = new DirectoryEntry(domainpath);
DirectorySearcher search = new DirectorySearcher(searchRoot);
search.Filter = "(&(objectClass=user)(objectCategory=person)(samaccountname="+username+"))";
SearchResult result;
search.PageSize = 10;
SearchResultCollection resultCol = search.FindAll();
for (int counter = 0; counter < resultCol.Count; counter++)
{
result = resultCol[counter];
if (result != null & counter < 2)
{
_username = result.Properties["samaccountname"][0].ToString();
_namn = result.Properties["displayname"][0].ToString();
_ort = result.Properties["l"][0].ToString();
_found = true;
}
else
{
_found = false;
_logg = "Hittade ej " + username + ".";
}
}
}
}
public class ADusers
{
public int[] _ID;
public ADuser[] _ADuser;
public bool _found;
public int _no_users;
public ADusers()
{
//
// Constructor
//
_no_users = 0;
}
public ADusers(string Stype, string Par)
{
//
// Major setup for AD-connections
//
// Parameters: Stype="ort" --> Hitta ADusers som finns på denna orten
// ..fler kommer läggas till..
//
// Par=värden som används vid ovan angivna funktion
//
ADuser[] _ADuser = new ADuser[];
DirectoryEntry entryRoot = new DirectoryEntry("LDAP://RootDSE");
string domain = (string)entryRoot.Properties["defaultNamingContext"][0];
string domainpath = "LDAP://mydomain.local";
DirectoryEntry searchRoot = new DirectoryEntry(domainpath);
DirectorySearcher search = new DirectorySearcher(searchRoot);
if ((Stype == "ort") & (Par != null))
{
_found = false;
search.Filter = "(&(objectClass=user)(objectCategory=person)(l="+Par+"))";
SearchResult result;
search.PageSize = 1000;
SearchResultCollection resultCol = search.FindAll();
for (int counter = 0; counter < resultCol.Count; counter++)
{
result = resultCol[counter];
if (result != null)
{
*ERROR* ==> _ADuser[counter]._username = result.Properties["samaccountname"][0].ToString();
_ADuser[counter]._namn = result.Properties["displayname"][0].ToString();
_ADuser[counter]._ort = result.Properties["l"][0].ToString();
_no_users = counter;
_found = true;
}
}
}
}
}
(Visual webb 2008 express)
Sv: Rookiefråga ang klasser/structs och instansiering/initiering variabler
I vilket fall som helst..
I public ADusers():
följande rad:
ADuser[] _ADuser = new ADuser[];
skapar en _lokal_ variabel. Inga problem med det, men det innebär att variabeln _ADuser i _klassen_ fortfarande kommer vara tom när konstruktorn har körts färdigt.
Ditt problem är dock.. Du skapar en ny, _tom_ array. Det är en array, det är bara det att den är just tom. Den har längden noll. När du sedan försöker använda din array så försöker du komma åt ett index som inte finns.
Jag föreslår att du tittar på klassen List<> (i namespacet System.Collections.Generic); om du skapar en lokal List<ADuser> så kan du helt enkelt anropa metoden Add() på den listan för att stoppa in nya objekt. Objektet skapar du i förväg, sätter alla egenskaper etc, sedan stoppar du in det. I slutet av konstruktorn sätter du klassens _ADusers = listan.ToArray();Sv:Rookiefråga ang klasser/structs och instansiering/initiering variabler
:))
Skall kolla på "List".
Återkommer om jag löste det.. :)
/Per
_____________________________
BTW: Felmeddelandet:
System.NullReferenceException was unhandled by user code
Message="Objektreferensen har inte angetts till en instans av ett objekt."
Source="App_Code.us_fjg1-"
StackTrace:
vid ADusers..ctor(String Stype, String Par) i c:\Users\test.ABC\Documents\Visual Studio 2008\WebSites\Register\App_Code\ADusers.cs:rad 126
vid ADtest.Page_Load(Object sender, EventArgs e) i c:\Users\test.ABC\Documents\Visual Studio 2008\WebSites\Register\ADtest.aspx.cs:rad 26
vid System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
vid System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
vid System.Web.UI.Control.OnLoad(EventArgs e)
vid System.Web.UI.Control.LoadRecursive()
vid System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)Sv: Rookiefråga ang klasser/structs och instansiering/initiering variabler
<code>
public struct Hamburgare
{
string brodTyp;
Boolean ost;
List<string> ingredienser;
}
public function SkapaHamburgare()
{
List<string> ingredienser1 = new List<string>();
ingredienser1.add("gurka");
ingredienser1.add("tomat");
Hamburgare hamburgare1 = new Hamburgare() { brodTyp = "glutenfri", ost = true, ingredienser = ingredienser1 }
List<Hamburgare> hamburgarLista = new List<Hamburgare>();
hamburgarLista.add(hamburgare1);
}
</code>
Undvik "vanliga" arrayer.. dom är bara krångliga i c#