webForumDet fria alternativet

Active Directory - Splitta sträng direkt vid hämtning av datan...

.NET

3 svar · 160 visningar · startad av T_Codez

Medlem sedan juli 2001458 inlägg
Frågan#1

Hej

Tidigare i det här forumet så fick jag hjälp med att populera (Weeeeeee! Jag har greppat ett fackord för att fylla värden i olika objekt) en listView.

Efter en del funderande och pulande så har jag noterat att jag skulle vilja använda detta på fler ställen i min lilla AD Applikation. Och det gör att jag vill ha det gjort redan vid inläsningen från AD:et till den första arraylisten... (Om det går)

Under denna tid som flutit förbi har den förändrats något också. Nu har jag fösökt att göra den mer skalbar. Alltså delat in koden i olika nivåer för att kunna "modifiera på en mindre yta" vid eventuella förändringsbehov.

/Gui (Vad användaren ser, innehåller mest formulär)
/Regler (Metoder som anropas utifrån vad användren gör)
/HamtaData (En våning som bara tar hand om AD & Databas åtkomst)

Denna kod ligger nu i det nedersta "lagret/våningen" HamtaData

internal IList HamtaADPersoner(string fNamn, string eNamn, string avd)
{
	System.DirectoryServices.DirectoryEntry entry = new System.DirectoryServices.DirectoryEntry("LDAP://domän.se", "User", "Password");

	System.DirectoryServices.DirectorySearcher mySearcher = new System.DirectoryServices.DirectorySearcher(entry);

	mySearcher.Filter = "(&(objectCategory=person)(objectClass=user)(givenname="+fNamn +"*" +")(sn="+eNamn +"*" +")(department="+ avd +"*" +")(samaccountname=*))";

	ArrayList personList = new ArrayList();

		foreach(System.DirectoryServices.SearchResult resEnt in mySearcher.FindAll())
		{
			System.DirectoryServices.DirectoryEntry de = resEnt.GetDirectoryEntry();
//			Läs in värden till arrayen som nyttjas av ListViewern några lager upp.
			personList.Add(new SSAB.EFH.Common.EFHClasses.Person(de.Properties["department"].Value.ToString(), de.Properties["name"].Value.ToString(), string.Empty,  string.Empty, de.Properties["samaccountname"].Value.ToString()));
		}
	return personList;
}

Och så här ser det ut i Gui nivån:


ArrayList personer = personHamtare.HamtaADPerson(textBoxFornamn.Text, textBoxEfternamn.Text, textBoxAvdelning.Text);
char[] testchar = {'.', ',', ' '};

foreach (EFHClasses.Person person in personer)
{
	int pos = person.Namn.IndexOfAny(testchar);
	if (pos > -1)
	{
		string[] namn = person.Namn.Split(testchar);
		if (namn[1].Length > 1)
		{
			ListViewItem personListItem = new ListViewItem(namn[1]);
			personListItem.SubItems.Add(namn[0]);				
			personListItem.SubItems.Add(person.AvdelningsNummer);
			personListItem.SubItems.Add(person.EnhetAlias);
			listViewAnvandare.Items.Add(personListItem);						
		}
	}
}

Tack för uppmärksamheten :e

Mvh /T

Ps. Fortsätter givetvis med mitt tunga "Trial And Error" ;)

Medlem sedan juli 2001458 inlägg
#2

Mors...

Nu har jag kommit lite längre.

Har lagt till ite i personobjektet så att det delar upp sig med fnamn och eNamn. Så nu har jag denna kod att fixa till det med:

foreach(System.DirectoryServices.SearchResult resEnt in mySearcher.FindAll())
{
	System.DirectoryServices.DirectoryEntry de = resEnt.GetDirectoryEntry();

	Person person = new Person();
	person.AvdelningsNummer = de.Properties["department"].Value.ToString();
	person.ForNamn = SplitName(de.Properties["name"].Value.ToString(), true);
	person.EfterNamn = SplitName(de.Properties["name"].Value.ToString(), false);
	person.TelefonNummer = string.Empty;
	person.EMail = string.Empty;
	person.EnhetAlias = de.Properties["samaccountname"].Value.ToString();
//	personList.Add(new SSAB.EFH.Common.EFHClasses.Person(de.Properties["department"].Value.ToString(), de.Properties["name"].Value.ToString(), string.Empty,  string.Empty, de.Properties["samaccountname"].Value.ToString()));
	personList.Add(person);

	// anropa metod 2 ggr som returnerar splitten av namn till fnamn / enamn (Kanske).
}
return personList;
}

private string SplitName(string name, bool surname)
{
	// splitta (samma för båda)
	char[] ch = new char[3];
	ch[0] = '.';
	ch[1] = ',';
	ch[2] = ' ';

//	int pos;
	string fNamn = "";
	string eNamn = "";

	if(name != null)
	{
//		eNamn = str[1];
		name.Split(ch);
		return "fNamn";
	}
//	else()
//		fNamn = name.S(ch);
//		return "eNamn";
		}

Som ni ser är det inge vidare i slutet.

Help Needed... Please :OO

Medlem sedan juli 2001458 inlägg
#3

Förtydligande:

Med samma foreach som ovan vill jag bara ha följande...

//			splitta name i 2 delar där... {' ', ',', '.'} förekommer (samma för båda)

//			Om person.ForNamn efterfrågas returnera fNamn

//			Om person.EfterNamn efterfrågas returnera eNamn

Men idag är det uppenbarligen bara kola i huvet.

Medlem sedan juli 2001458 inlägg
#4

Weeeeeeeeeeeeeee... :e :birp

Så häs ska det se ut:


foreach(System.DirectoryServices.SearchResult resEnt in mySearcher.FindAll())
{
	System.DirectoryServices.DirectoryEntry de = resEnt.GetDirectoryEntry();

	//Läs in värden till arrayen som nyttjas av ListViewern/Datagriden några lager/våningar upp.
	Person person = new Person();
	person.AvdelningsNummer = de.Properties["department"].Value.ToString();
	person.ForNamn = SplitName(de.Properties["name"].Value.ToString(), false);
	person.EfterNamn = SplitName(de.Properties["name"].Value.ToString(), true);
	person.TelefonNummer = string.Empty;
	person.EMail = string.Empty;
	person.EnhetAlias = de.Properties["samaccountname"].Value.ToString();

	personList.Add(person);
}

return personList;
}

private string SplitName(string name, bool surname)
{
	char[] delimiters = new char[3] {',', '.', ' '};

	string[] namndelning = name.Split(delimiters,2);

	if(surname)
	{
		if (namndelning.Length < 2)
		{
			// ingen träff i ad:et
			return null;
		}
		else
			return namndelning[1];
	}
	else
		return namndelning[0];
}

Tack för uppmärksamheten :e Y'all

254 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)