c#:如何知道在Windows中是否存在“用户帐户”?

我有两个问题。

1)如何知道我的Windows操作系统(vista)上是否存在“用户帐户”? 我需要一个独立的机器的信息。 我的意思是,机器不join任何域。

2)我也想知道一个用户是否是一个组的一部分? 例如。 是pipe理员组的用户“pipe理员”部分还是不是?

任何人都可以帮助..

您可以使用下面的代码来确定本地帐户是否通过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; } 

我已经尝试了下面的代码,并为我工作正常..

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

你可能想看看这个论坛帖子 。 它会通过机器上的用户通过WMI给你列举的列表。 然后,您可以检查您的帐户是否在那里。 论坛也链接到一个关于代码项目的文章。 我相信你也可以通过WMI获得组员资格,但是我可能是错的。