2009-04-10 5 views

Répondre

2

Vous pouvez exécuter « net localgroup administrateurs » et analyser les résultats. Je suppose qu'il existe un meilleur moyen, mais sinon ...

+0

merci pour la réponse rapide. Bien que de cette manière, si un groupe est ajouté au groupe admin, nous devons toujours déterminer si l'utilisateur appartient à ce groupe. –

0

Les utilisateurs peuvent appartenir au groupe "Administrateurs" sur le serveur local ou faire partie des groupes "Administrateurs du domaine" ou "Administrateurs de l'entreprise" définis dans votre UN D. La solution idéale serait de créer une DLL avec une méthode appelée IsUserAdmin (nom_utilisateur) qui accepte un paramètre de nom d'utilisateur et renvoie true ou false.

En interne, la méthode appellera la méthode IADsUser :: Groups pour déterminer les groupes auxquels appartient l'utilisateur fourni et retournera true si les groupes énumérés appartiennent à l'un des groupes d'administrateurs ci-dessus. Sinon, il retournera faux. Vous pouvez invoquer cette DLL dans vos projets InstallShield. Méfiez-vous des groupes imbriqués.

+0

thx, nous pouvons également le faire dans un vbscript qui est pris en charge dans les actions personnalisées InstallShield. Bien que je me demande encore s'il y a déjà une fonction similaire dans certains win32 dll que je peux appeler directement. –

0

Je peux penser à deux approches, mais chacune impliquerait l'écriture de code au-dessus de votre script d'installation, je ne suis plus familier avec Installshield, mais probablement comme les projets d'installation Visual Studio vous avez le concept de custom actes. Je suppose que c'est ce dont vous aurez besoin.

Je ne décris la première parce que le second est assez complexe (à savoir encore plus complexe que la première!). L'approche évidente est AD. L'extrait de code suivant vous indiquera s'il existe une combinaison nom d'utilisateur/mot de passe. Après avoir obtenu l'utilisateur que je suis sûr que vous pouvez travailler sur quels groupes ils sont.

if (true == String.IsNullOrEmpty(userName)) throw new Exception("userName not set"); 

DirectoryEntry entry = new DirectoryEntry(); 
entry.Username = userName; // Use the fully qualified name here 
entry.Password = password; 

string DomainlessUsername = userName.Substring(userName.LastIndexOf('\\') + 1, userName.Length - userName.LastIndexOf('\\') - 1); 

// We know straight away that if this is empty, we've drawn a blank! 
if (true == String.IsNullOrEmpty(DomainlessUsername)) throw new Exception("userName not set"); 

DirectorySearcher search = new DirectorySearcher(entry); 
search.Filter = "(SAMAccountName=" + DomainlessUsername + ")"; 
search.PropertiesToLoad.Add("cn"); 

SearchResult result = search.FindOne(); 

if (null == result) 
{ 
    throw new Exception("FindOne executed without exception, but result was null"); 
} 
else 
{ 
    // some logging here 
} 
return true; 

Maintenant, il y a un problème potentiel ici si le compte qui exécute ce code ne dispose pas de privilèges d'accès AD. Je ne vais pas entrer dans les détails à ce poste parce que nous espérons que le code ci-dessus sera suffisant pour vous aider, mais le principe de base de l'approche alternative consiste à débourser directement advapi32.dll à des fonctions telles que LogonUser. (Gardez à l'esprit que, encore une fois, mon problème était de valider les informations d'identification ne vérifiant pas les droits d'administrateur, mais il y a probablement un lien là-bas si vous êtes prêt à creuser).

Espérons que certaines de cette aide!

Questions connexes