Para responder a la pregunta de análisis, utilice PInvoke con DsGetRdnW
. Para el código, vea mi respuesta a otra pregunta: https://stackoverflow.com/a/11091804/628981.
Pero parece que lo estás haciendo mal.Primero, obtenga el SID para su grupo objetivo:
string targetGroupName = //target group name;
DirectorySearcher dsTargetGroup = new DirectorySearcher();
dsTargetGroup.Filter = string.Format("(sAMAccountName={0})", targetGroupName);
SearchResult srTargetGroup = dsTargetGroup.FindOne();
DirectoryEntry deTargetGroup = srTargetGroup.GetDirectoryEntry();
byte[] byteSid = (byte[])deTargetGroup.Properties["objectSid"].Value;
SecurityIdentifier targetGroupSid = new SecurityIdentifier(byteSid, 0);
Luego, depende de lo que tenga. Si el usuario está ejecutando su aplicación (o autenticada en su sitio web/servicio), enumere los SID en el token. Por ejemplo, en aplicaciones de escritorio, use WindowsIdentity.GetCurrent().Groups
. De lo contrario, tendrá que obtener un DirectoryEntry para el usuario y luego obtener el atributo tokenAttributes
como spoulson sugirió:
DirectoryEntry deTargetUser = //target user;
DirectorySearcher dsTargetUser = new DirectorySearcher(deTargetUser);
dsTargetUser.SearchScope = SearchScope.Base; //tokenGroups is a constructed attribute, so have to ask for it while performing a search
dsTargetUser.Filter = "(objectClass=*)"; //this is closest thing I can find to an always true filter
dsTargetUser.PropertiesToLoad.Add("tokenGroups");
SearchResult srTargetUser = dsTargetUser.FindOne();
foreach(byte[] byteGroupSid in srTargetUser.Properties["tokenGroups"])
{
SecurityIdentifier groupSid = new SecurityIdentifier(byteGroupSid, 0);
if(groupSid == targetGroupSid)
{
//success
}
}
En caso de que necesita para obtener un DirectoryEntry de una SID, se puede obtener el texto que desea buscar :
public static string GetSIDSearchFilter(SecurityIdentifier sid)
{
byte[] byteSid = new byte[sid.BinaryLength];
sid.GetBinaryForm(byteSid, 0);
return string.Format("(objectSid={0})", BuildFilterOctetString(byteSid));
}
public static string BuildFilterOctetString(byte[] bytes)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
sb.AppendFormat("\\{0}", bytes[i].ToString("X2"));
}
return sb.ToString();
}
Suena como que necesita una expresión regular - RegEx debe hacer el trabajo ... Ver –
http://stackoverflow.com/questions/356480/c-extracting-a-name-from-a-string – nos
No quiero usar RegEx porque no quiero incurrir en el costo de la prueba. Gracias por la sugerencia tú. –