2010-01-11 160 views
12

我有兩個問題。c#:如何知道'用戶帳戶'是否存在於Windows?

1)如何知道我的Windows操作系統(vista)上是否存在「用戶帳戶」?我需要一個獨立機器的這個信息。我的意思是,機器不加入任何域。

2)我也想知道用戶是否屬於一個組?例如。是管理員組的用戶'管理員'部分還是不是?

任何人都可以請幫助..

回答

2

我曾嘗試下面的代碼,併爲我工作很好..

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

你可能想看看這個forum post。它會通過機器上的用戶通過WMI爲您提供枚舉列表。然後你可以檢查你的賬戶是否在那裏。該論壇也鏈接到code project上的一篇文章。我相信你也可以通過WMI獲得組員資格,但我可能是錯的。

10

使用以下代碼可以計算出本地帳戶是否通過System.Security.Principal命名空間存在。

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

現在越來越組成員身份是有點困難,你可以很容易地使用WindowsPrinciple.IsInRole方法(從WindowsIdentify.GetCurrent()方法創建一個原理)當前用戶做到這一點。

正如我所指出的,我不認爲有一種方法可以在不借助pinvoke或WMI的情況下獲得其他任何東西。所以這裏有一些代碼用於檢查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

非常感謝蟲族。它正在工作,但有點慢。無論如何,再次感謝! – satya 2010-01-12 11:02:06

+0

如果您將NTAccount更改爲此NTAccount acct = new NTAccount(Environment.MachineName,name);它的速度更快。因人而異。 – Tollo 2012-07-26 11:01:49

相關問題