Puede resolver si existe una cuenta local a través del espacio de nombres System.Security.Principal con el siguiente código.
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;
}
Ahora conseguir pertenencia a un grupo es un poco más difícil, se puede hacer fácilmente para el usuario actual utilizando el método WindowsPrinciple.IsInRole (la creación de un principio del método WindowsIdentify.GetCurrent()).
Como se señaló, no creo que haya una manera de obtener nada más sin recurrir a pinvoke o WMI. Así que aquí hay un poco de código para verificar la membresía del grupo con 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;
}
gracias tiránida mucho. Está funcionando, pero un poco lento. de todos modos, ¡gracias de nuevo! – satya
Si cambia NTAccount a este NTAccount acct = new NTAccount (Environment.MachineName, name); es MUCHO más rápido. YMMV. – Tollo