Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道用户帐户是否存在_C#_Windows_User Accounts - Fatal编程技术网

C# 如何知道用户帐户是否存在

C# 如何知道用户帐户是否存在,c#,windows,user-accounts,C#,Windows,User Accounts,如何知道我的Windows操作系统(Vista)上是否存在用户帐户?我需要一台尚未加入任何域的单机提供此信息 我想知道用户是否是组的一部分,例如,用户“admin”是否是“Administrators”组的一部分 您可以使用以下代码通过名称空间确定本地帐户是否存在 bool AccountExists(string name) { bool bRet = false; try { NTAccount acct = new NTAccount(name);

如何知道我的Windows操作系统(Vista)上是否存在用户帐户?我需要一台尚未加入任何域的单机提供此信息

  • 我想知道用户是否是组的一部分,例如,用户“admin”是否是“Administrators”组的一部分


  • 您可以使用以下代码通过名称空间确定本地帐户是否存在

    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;
    }
    
    现在获得组成员资格稍微困难一些,您可以使用该方法(从该方法创建原则)轻松地为当前用户实现这一点

    正如我所指出的,我不认为有一种方法可以不借助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;
        }
    

    多谢你,泰兰德。它正在工作,但有点慢。无论如何,再次感谢!!如果将NTAccount更改为此NTAccount acct=new NTAccount(Environment.MachineName,name);要快得多。你可能想看看这个。它将通过WMI提供计算机上用户的枚举列表。然后,您可以检查您的帐户是否存在。论坛还链接到了一篇关于这个问题的文章。我相信你也可以通过WMI获得团体成员资格,但我可能错了。