Để trả lời câu hỏi phân tích, sử dụng PInvoke với DsGetRdnW
. Đối với mã, xem câu trả lời của tôi cho một câu hỏi khác: https://stackoverflow.com/a/11091804/628981.
Nhưng có vẻ như bạn đang làm sai.Trước tiên, hãy nhận SID cho nhóm mục tiêu của bạn:
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);
Sau đó, tùy thuộc vào những gì bạn có. Nếu người dùng đang chạy ứng dụng của bạn (hoặc được xác thực cho trang web/dịch vụ của bạn), thì hãy liệt kê các SID trong mã thông báo. Ví dụ: trong ứng dụng dành cho máy tính để bàn, hãy sử dụng WindowsIdentity.GetCurrent().Groups
. Nếu không, bạn sẽ cần phải nhận được một DirectoryEntry cho người sử dụng và sau đó nhận được các thuộc tính tokenAttributes
như spoulson gợi ý:
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
}
}
Chỉ trong trường hợp bạn cần phải nhận được một DirectoryEntry từ một SID, bạn có thể nhận được các chuỗi tìm kiếm bằng :
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();
}
Nguồn
2012-11-21 14:48:13
Âm thanh như bạn cần một biểu thức chính quy - RegEx nên thực hiện công việc ... –
Xem http://stackoverflow.com/questions/356480/c-extracting-a-name-from-a-string – nos
Tôi không muốn sử dụng RegEx vì tôi không muốn chịu chi phí kiểm tra. Cảm ơn bạn đã gợi ý. –