【问题标题】:Using Java, How can I get a list of all local users on a windows machine使用 Java,如何获取 Windows 机器上所有本地用户的列表
【发布时间】:2008-12-02 12:29:39
【问题描述】:

如何使用 java 列出在 windows 机器 (Win2000+) 上配置的所有本地用户。
如果可能的话,我宁愿使用任何 java 2 com 网桥或任何其他第三方库来执行此操作。
首选Java的一些本机方法。

【问题讨论】:

    标签: java windows security operating-system


    【解决方案1】:

    使用 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();
        }
    }
    }
    

    【讨论】:

    • 你能提供完整的代码示例吗?我对 Jacob 和 COM 不熟悉(其他答案中的代码不正确)
    • 完整示例不可用,也许像stackoverflow.com/questions/1817459/… 这样的线索会有所帮助。 Jacob 现在在sourceforge.net/projects/jacob-project
    • 如何获取 PartComponent 的 Name 属性? (已解决:我可以将 Win32_SystemUsers 替换为 Win32_UserAccount 并将 PartComponent 替换为 Name)。另外,你应该删除“break;”来自您的代码。
    • @akapelko - 删除了中断。很高兴你可以使用这个例子 ;-)
    【解决方案2】:

    使用 Java COM 对象,即 Jacob:

    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】:

      我需要一个更简单的解决方案。
      此实现将使用“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返回给调用者。

      【讨论】:

        【解决方案4】:
        import com.sun.jna.platform.win32.Netapi32Util;
        
            Netapi32Util.User[] users = Netapi32Util.getUsers();
            for(Netapi32Util.User user : users) {
                System.out.println(user.name);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          • 2021-12-08
          • 2023-04-03
          • 1970-01-01
          • 2020-03-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多