6

如何从 C# 检查本地用户帐户(即本地管理员帐户)是否处于活动状态?

我真正想要的是“net user Administrator”命令的“Account Active”=“Yes”(或“No”)输出的 C# 替代品。

恐怕这个问题看起来与这个问题重复但我不知道为根 DirectoryEntry 对象的参数传递什么。尝试了不同的东西,如“ldap://”+ Environment.MachineName、“ldap://127.0.0.1”、“WinNT://”+ Environment.MachineName,但都没有奏效。在所有三种情况下,我都收到 searcher.FindAll() 调用引发的异常。

4

5 回答 5

5
class Program
{
    static void Main(string[] args)
    {

        // Create the context for the principal object. 
        PrincipalContext ctx = new PrincipalContext(ContextType.Machine);

        UserPrincipal u = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "Administrator");
        Console.WriteLine(String.Format("Administrator is enable: {0}", u.Enabled));

    }
}
于 2012-09-07T14:44:29.053 回答
1

您可以查询 WMI 的Win32_UserAccount

这是 MS 的wmi 代码创建者作为参考吐出的样板;

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT Disabled FROM Win32_UserAccount WHERE name = 'alexk'");

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_UserAccount instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Disabled: {0}", queryObj["Disabled"]);
                    Console.ReadKey();
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

(我会链接该工具,但像往常一样,msdn 链接已失效)

于 2012-09-07T13:34:15.060 回答
1

试试这个。

 var server = "YOURMACHINENAME";
 var username = "Guest"; 
 var de = new DirectoryEntry {Path = "WinNT://" + server + ",computer"};
 var result = de.Children
     .Cast<DirectoryEntry>()
     .First<DirectoryEntry>(d => d.SchemaClassName == "User" && d.Properties["Name"].Value.ToString() == username);

 var flags = (int)result.Properties["UserFlags"].Value;
 var disabled = (flags & 2) == 2;
于 2012-09-07T13:40:03.363 回答
0

不完全相同,但他们使用DirectoryEntry directoryEntry = new DirectoryEntry(string.Format("WinNT://{0}/{1}", computerName, username)); 会有帮助吗?

于 2012-09-07T13:36:38.643 回答
0

考虑到它是本地用户,你需要调用win32 api函数NetGetUserInfo来获取你需要的东西。

pinvoke.net 中的示例几乎是您所需要的,但是您需要将 level 参数更改为 2 以获取必要的信息

于 2012-09-07T13:44:46.477 回答