2010-01-11 2 views
12

Tôi có hai câu hỏi.C#: cách biết liệu 'tài khoản người dùng' có tồn tại trong các cửa sổ không?

1) Làm cách nào để biết liệu 'tài khoản người dùng' có tồn tại trên các cửa sổ của tôi OS (vista) không? Tôi cần thông tin này của một máy đứng một mình. Ý tôi là, máy không tham gia vào bất kỳ miền nào.

2) Tôi cũng muốn biết liệu người dùng có phải là một phần của nhóm không? cho ví dụ. là một phần 'quản trị viên' của nhóm quản trị viên hay không?

bất kỳ ai cũng có thể giúp ..

Trả lời

2

Tôi đã thử đoạn mã sau và đang làm việc tốt cho tôi ..

public bool IsUserMemberOfGroup(string userName, string groupName) 
    { 
     bool ret = false; 

     try 
     { 
      DirectoryEntry localMachine = new DirectoryEntry("WinNT://" + Environment.MachineName); 
      DirectoryEntry userGroup = localMachine.Children.Find(groupName, "group"); 

      object members = userGroup.Invoke("members", null); 
      foreach (object groupMember in (IEnumerable)members) 
      { 
       DirectoryEntry member = new DirectoryEntry(groupMember); 
       if (member.Name.Equals(userName, StringComparison.CurrentCultureIgnoreCase)) 
       { 
        ret = true; 
        break; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      ret = false; 
     } 
     return ret; 
    } 
0

Bạn có thể muốn xem điều này forum post. Nó sẽ cung cấp cho bạn danh sách liệt kê thông qua WMI của người dùng trên máy. Sau đó, bạn có thể kiểm tra xem liệu tài khoản của bạn có ở đó hay không. Diễn đàn cũng liên kết đến một bài viết trên code project. Tôi tin rằng bạn có thể có được thành viên nhóm thông qua WMI là tốt, nhưng tôi có thể sai.

10

Bạn có thể giải quyết nếu tài khoản cục bộ tồn tại thông qua không gian tên System.Security.Principal bằng cách sử dụng mã sau.

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; 
} 

Bây giờ nhận thành viên nhóm là hơi khó, bạn có thể dễ dàng làm điều đó cho người dùng hiện bằng cách sử dụng phương pháp WindowsPrinciple.IsInRole (tạo ra một nguyên tắc từ phương pháp WindowsIdentify.GetCurrent()).

Như đã chỉ ra, tôi không nghĩ rằng có một cách để nhận được bất cứ điều gì khác mà không cần đến pinvoke hoặc WMI. Vì vậy, đây là một chút mã để kiểm tra thành viên nhóm với 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; 
} 
+0

Cảm ơn tyranid rất nhiều. Nó đang hoạt động, nhưng hơi chậm. dù sao, cảm ơn một lần nữa !! – satya

+0

Nếu bạn thay đổi NTAccount thành NTAccount acct = new NTAccount (Environment.MachineName, name); một LOT của nó nhanh hơn. YMMV. – Tollo