vrijdag 9 mei 2008

PSV.tv op Windows Media Center

Als voetbalfan leek het me wel leuk op de beelden van PSV.tv, Ajax.tv, Feyenoord.tv, enz. via mijn Windows Media Center te kunnen bekijken. Ik dacht: zal ik daar een apart programma voor ontwikkelen of probeer ik gebruik te maken van wat er al is? Meestal probeer ik voor de 2e optie te gaan, wat nu ook het geval was.

Wat er al is: de Media Center RSS Reader van OABsoftware voor Windows XP en Vista. Deze software is gratis te gebruiken. Alleen moet het wel geactiveerd worden, wat je kan doen door je te registreren.

Wat moet ik dan nog ontwikkelen: een programmaatje om intelligent de HTML van deze TV sites te verwerken tot RSS feeds, waar deze software goed mee om kan gaan. En dit is gelukt... helaas niet voor Feyenoord.tv want daar moet je je aanmelden om de beelden te mogen bekijken.
Iedereen die gebruik wil maken van mijn RSS feeds kan deze vinden op:
- PSV.tv
- Ajax.tv

Als je nog meer ideeën hebt voor het verwerken van dit soort webpagina's tot RSS feeds, dan laat je maar een berichtje achter op deze blog.

donderdag 8 mei 2008

Active Directory benaderen in .Net 3.5

Microsoft heeft in het .Net framework versie 3.5 de assembly System.DirectoryServices.AccountManagement toegevoegd, welke mogelijkheden biedt om redelijk eenvoudig de Active Directory (of de accountdatabase (SAM) op een lokale PC) te benaderen en te wijzigingen. In deze blog richt ik me alleen op de Active Directory (AD).

Je maakt hierbij gebruik van de PrincipalContext klasse. Hieronder een voorbeeld hoe deze klasse te instanciëren:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "MijnDomein");
Hierbij word een 'context' gecreëerd wat de basis is voor alle acties die in de AD uitgevoerd zullen gaan worden. Er wordt daardwerkelijk een verbinding met de directory ('MijnDomein') gemaakt.

Hierna kan je eenvoudig een User of Group ophalen en eventueel wijzigen. De basis klasse die hiervoor gebruikt wordt is de Principal klasse. Hieronder een voorbeeld hoe je een User of Group ophaalt:
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "Danny");
en
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "Administrators");
Met behulp van de Save methode kunnen wijzigingen op de principals doorgevoerd worden.

Een gebruiker kan ook gevalideerd worden (op bestaandheid én op correct wachtwoord). De ValidateCredentials(string userName, string password) methode van de PrincipalContext klasse kan hiervoor gebruikt worden.

Dankzij de PrincipalSearcher klasse en LINQ is het mogelijk ook relatief eenvoudig te zoeken naar Members (Users en Groups) in de Active Directory. In het voorbeeld hieronder wordt gezocht naar alle Users, welke de voornaam 'Danny' hebben:
//Creëer de context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "MijnDomein");

//Creëer een UserPrincipal om te gebruiken voor de Query
UserPrincipal u = new UserPrincipal(ctx);
//Zet de eigenschappen om naar te zoeken
u.GivenName = "Danny";

//Creëer de PrincipalSearcher om mee te zoeken
PrincipalSearcher ps = new PrincipalSearcher(u);
// Voer de Query uit
PrincipalSearchResult results = ps.FindAll();

De FindAll methode in de PrincipalSearcher klasse geeft een PrincipalSearchResult terug, welke de mogelijkheid biedt om met behulp van LINQ queries op het resultaat uit te voeren.

Ik heb zelf wat onderzoek gedaan naar de System.DirectoryServices.AccountManagement namespace, omdat ik een lijst met gebruikers op wil vragen uit een specifieke groep in de AD. De standaard methodieken hiervoor bieden helaas alleen de mogelijkheid om de gebruikers die in de groep zelf zitten te bepalen, maar niet om recursief (groepen in groepen) te zoeken naar de gebruikers. Hieronder de code die ik heb ontwikkelt, welke dit wel mogelijk maakt:
public static List GetGroupUsers(string domainName, string groupName, bool recursive)
{
//Creëer de context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainName);
//Haal de AD Group op
using (GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(ctx, groupName))
{
//Loop door de Members om de Users te bepalen
List result = new List();
foreach (Principal principal in groupPrincipal.Members)
{
if (principal is UserPrincipal)
result.Add(principal);
}
//Loop door de Members om de Groups recursief te benaderen
if (recursive)
{
foreach (Principal principal in groupPrincipal.Members)
{
//Controleer of de member een Group is
if (principal is GroupPrincipal)
{
//Roep deze methode aan, zodat de recursie ontstaat
foreach (Principal p in GetGroupUsers(domainName, principal.Name, recursive))
{
//geen dubbele Users in de lijst
if (!result.Contains(p))
result.Add(p);
}
}
}
}
return result;
}
}




Bronnen:
Microsoft MSDN
Boeken:
The .NET Developer's Guide to Directory Services Programming