代码之家  ›  专栏  ›  技术社区  ›  Alex Shnayder

使用Java,如何在Windows机器上获取所有本地用户的列表

  •  1
  • Alex Shnayder  · 技术社区  · 16 年前

    如何使用Java列出在Windows机器上配置的所有本地用户(WIN2000 +)。
    如果可能的话,我更愿意使用任何Java 2 COM网桥或任何其他第三方库。
    最好是Java的一些本地方法。

    3 回复  |  直到 10 年前
        1
  •  3
  •   gimel    12 年前

    使用Java COM桥,像 Jacob . 然后选择适当的COM库,例如 COM API for WMI 列出本地用户或任何其他Windows管理信息。

    这个 Win32_SystemUsers 关联WMI类将计算机系统和该系统上的用户帐户关联起来。

    这个 Win32_Account 抽象WMI类包含有关运行Windows的计算机系统已知的用户帐户和组帐户的信息。Windows NT域识别的用户或组名是此类的后代(或成员)。

    工作示例(jacob 1.17-m2,javase-1.6):

    import java.util.Enumeration;
    import com.jacob.activeX.ActiveXComponent;
    import com.jacob.com.ComThread;
    import com.jacob.com.EnumVariant;
    import com.jacob.com.Variant;
    
    public class ComTst {
    public static void main(String[] args) {
        ComThread.InitMTA();
        try {
            ActiveXComponent wmi = new ActiveXComponent("winmgmts:\\\\.");
            Variant instances = wmi.invoke("InstancesOf", "Win32_SystemUsers");
            Enumeration<Variant> en = new EnumVariant(instances.getDispatch());
            while (en.hasMoreElements())
            {
                ActiveXComponent bb = new ActiveXComponent(en.nextElement().getDispatch());
                System.out.println(bb.getPropertyAsString("PartComponent"));
            }
        } finally {
            ComThread.Release();
        }
    }
    }
    
        2
  •  2
  •   arkon    13 年前

    使用Java COM对象,即雅各伯:

    public static void EnumerateUsers() {
    
        String query = "SELECT * FROM Win32_UserAccount";
        ActiveXComponent axWMI = new ActiveXComponent("winmgmts:\\");
        Variant vCollection = axWMI.invoke("ExecQuery", new Variant(query));
        EnumVariant enumVariant = new EnumVariant(vCollection.toDispatch());
        Dispatch item = null;
        StringBuilder sb = new StringBuilder();
    
        while (enumVariant.hasMoreElements()) {
                item = enumVariant.nextElement().toDispatch();
                sb.append("User: " + Dispatch.call(item, "Name")).toString();
                System.out.println(sb);
                sb.setLength(0);
        } 
    
    }
    
        3
  •  0
  •   Matt Ball    14 年前

    我需要的是一个更简单的解决方案。
    此实现将使用“ net user “获取计算机上所有用户列表的命令。这个命令有一些我不关心的格式,我只关心我的用户是否在列表中。如果有人需要实际的用户列表,他可以解析“net user”的输出格式来提取列表,而不需要“net use”生成的垃圾头和垃圾尾。

    private boolean isUserPresent() {
        //Load user list
        ProcessBuilder processBuilder = new ProcessBuilder("net","user");
        processBuilder.redirectErrorStream(true);
        String output = runProcessAndReturnOutput(processBuilder);
        //Check if user is in list
        //We assume the output to be a list of users with the net user
        //Remove long space sequences
        output = output.replaceAll("\\s+", " ").toLowerCase();
        //Locate user name in resulting list
        String[] tokens = output.split(" ");
        Arrays.sort(tokens);
        if (Arrays.binarySearch(tokens, "SomeUserName".toLowerCase()) >= 0){
          //We found the user name
          return true;
        }
        return false;
    }
    

    方法runprocessandreturnoutput运行进程,收集进程的stdout和stderr,并将其返回给调用方。