2010-05-25 7 views
6

Sto tentando di determinare se un utente è membro di un determinato gruppo utilizzando System.DirectoryServices.AccountManagment.DirectoryServicesCOMException quando si utilizza System.DirectoryServices.AccountManagement

  • Lo sto facendo all'interno di una WebPart SharePoint in SharePoint 2007 su un sistema a 64 bit.
  • Destinatari .NET 3.5
  • La rappresentazione è abilitata nel web.config.
  • Il sito IIS in questione utilizza un pool di applicazioni IIS con un utente di dominio configurato come identità.

sono in grado di creare un'istanza di un PrincipalContext come tale:

PrincipalContext pc = new PrincipalContext(ContextType.Domain)

Avanti, cerco di afferrare un principio:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
{ 
    GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\somegroup"); 
    // snip: exception thrown by line above. 
} 

Sia il sopra e UserPrincipal.FindByIdentity con un utente SAM gettare un DirectoryServicesCOMException: "Errore di accesso: nome utente sconosciuto o password errata"

Ho provato a passare in un SAMAccountName completo a FindByIdentity (nella forma di MYDOMAIN \ username) o semplicemente al nome utente senza modifiche di comportamento. Ho provato ad eseguire il codice con altre credenziali utilizzando entrambi gli approcci HostingEnvironment.Impersonate e SPSecurity.RunWithElevatedPrivileges e anche lo stesso risultato.

Ho anche provato un'istanza mio contesto con il nome di dominio in atto:

Principal Context pc = new PrincipalContext(ContextType.Domain, "MYDOMAIN");

Questo getta una PrincipalServerDownException: "Il server non è stato possibile contattare"

Sto lavorando su un server ragionevolmente rinforzato. Non ho bloccato il sistema, quindi non sono sicuro di cosa è stato fatto. Se ci sono credenziali devo allocare l'utente dell'identità del mio pool o nella politica di sicurezza del dominio per far sì che funzionino, posso configurare il dominio di conseguenza. Ci sono impostazioni che potrebbero impedire l'esecuzione del mio codice? Mi manca qualcosa nel codice stesso? Questo non è possibile in un web SharePoint?

MODIFICA: Dopo ulteriori test, il mio codice funziona correttamente quando testato in un'applicazione della console che utilizza .NET 4.0. Ho preso di mira un framework diverso perché non avevo AccountManagement disponibile per me nell'app della console quando si utilizzava .NET 3.5 per qualche motivo.

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain)) 
using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, "MYDOMAIN\joe.user")) 
using (GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\user group")) 
{ 
    if (adUser.IsMemberOf(adGroup)) 
    { 
     Console.WriteLine("User is a member!"); 
    } 
    else 
    { 
     Console.WriteLine("User is NOT a member."); 
    } 
} 

Cosa varia nel mio ambiente SharePoint che potrebbe impedire l'esecuzione di questa funzione?

risposta

1

Ho aggiunto l'account utilizzato dal pool di applicazioni IIS al gruppo Administrators e questo problema è stato risolto.

+3

Probabilmente dovresti prendere nota che questo è l'approccio "Iron Fist of Justice", e non una soluzione raccomandata per un sistema di produzione o di Internet. –

+2

@Burly - Buon punto. Funziona nei miei ambienti: un sistema interno su una rete disconnessa. Non è una soluzione di cui sono contento, ma è una soluzione, quindi lo farà per ora.Sto davvero sperando in una guida su quali privilegi hanno gli amministratori che consentono l'esecuzione del codice senza errori. Mi piacerebbe rimuovere il privilegio di amministratore da quell'utente e garantire qualcosa di più sicuro continuando l'operazione come richiesto. – antik

+0

@antik Hai finalmente rimosso il privilegio di amministratore ed essere in grado di eseguirlo senza eccezioni? – FMFF