पार्स सवाल का जवाब करने के लिए, DsGetRdnW
साथ PInvoke का उपयोग करें। कोड के लिए, मेरा उत्तर दूसरे प्रश्न पर देखें: https://stackoverflow.com/a/11091804/628981।
लेकिन ऐसा लगता है कि आप इसे गलत कर रहे हैं।सबसे पहले, अपने लक्षित समूह के लिए एसआईडी प्राप्त करें:
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);
फिर, यह आपके पास निर्भर करता है कि यह आपके पास है। यदि उपयोगकर्ता आपका ऐप चला रहा है (या आपकी वेबसाइट/सेवा के लिए प्रमाणित), तो टोकन में एसआईडी का आकलन करें। उदाहरण के लिए, डेस्कटॉप ऐप्स में WindowsIdentity.GetCurrent().Groups
का उपयोग करें। अन्यथा, आप spoulson तरह का सुझाव दिया है उपयोगकर्ता के लिए एक DirectoryEntry और फिर tokenAttributes
विशेषता पाने के लिए की आवश्यकता होगी:
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
}
}
बस मामले में आप एक सिड से एक DirectoryEntry प्राप्त करने की आवश्यकता है, तो आप खोज स्ट्रिंग से प्राप्त कर सकते हैं :
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();
}
स्रोत
2012-11-21 14:48:13
ध्वनि - रेगुलर एक्सप्रेशन से काम करना चाहिए ... –
देखें http://stackoverflow.com/questions/356480/c-extracting-a-name-from-a-string – nos
मैं RegEx का उपयोग नहीं करना चाहता क्योंकि मैं परीक्षण लागत नहीं लेना चाहता हूं। सुझाव के लिए धन्यवाद। –