Vous pouvez vérifier si un compte local existe via l'espace de noms System.Security.Principal à l'aide du code suivant.
bool AccountExists(string name)
{
bool bRet = false;
try
{
NTAccount acct = new NTAccount(name);
SecurityIdentifier id = (SecurityIdentifier)acct.Translate(typeof(SecurityIdentifier));
bRet = id.IsAccountSid();
}
catch (IdentityNotMappedException)
{
/* Invalid user account */
}
return bRet;
}
Maintenant, pour appartenance à un groupe est un peu plus difficile, vous pouvez facilement le faire pour l'utilisateur actuel en utilisant la méthode WindowsPrinciple.IsInRole (création d'un principe de la méthode WindowsIdentify.GetCurrent()).
Comme souligné, je ne pense pas qu'il existe un moyen d'obtenir autre chose sans avoir recours à pinvoke ou WMI. Donc, voici un peu de code pour vérifier l'appartenance à un groupe avec WMI.
bool IsUserInGroup(string name, string group)
{
bool bRet = false;
ObjectQuery query = new ObjectQuery(String.Format("SELECT * FROM Win32_UserAccount WHERE Name='{0}' AND LocalAccount=True", name));
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection objs = searcher.Get();
foreach (ManagementObject o in objs)
{
ManagementObjectCollection coll = o.GetRelated("Win32_Group");
foreach (ManagementObject g in coll)
{
bool local = (bool)g["LocalAccount"];
string groupName = (string)g["Name"];
if (local && groupName.Equals(group, StringComparison.InvariantCultureIgnoreCase))
{
bRet = true;
break;
}
}
}
return bRet;
}
Merci beaucoup Tyranides. Ça marche, mais un peu lent. de toute façon, merci encore !! – satya
Si vous modifiez NTAccount à ce NTAccount acct = new NTAccount (Environment.MachineName, name); C'est beaucoup plus rapide. YMMV. – Tollo