使用Java,如何获取windows计算机上所有本地用户的列表

使用Java,如何获取windows计算机上所有本地用户的列表,java,windows,security,operating-system,Java,Windows,Security,Operating System,如何列出使用java在windows机器Win2000+上配置的所有本地用户。 我更愿意使用任何java 2 com桥或任何其他第三方库(如果可能)来实现这一点。 与Java相比,最好使用一些本机方法 使用Java COM桥接器,如。然后选择适当的COM库,例如列出本地用户或任何其他Windows管理信息 关联WMI类将计算机系统与该系统上的用户帐户相关联 抽象WMI类包含有关运行Windows的计算机系统已知的用户帐户和组帐户的信息。Windows NT域识别的用户名或组名是此类的后代或成员

如何列出使用java在windows机器Win2000+上配置的所有本地用户。 我更愿意使用任何java 2 com桥或任何其他第三方库(如果可能)来实现这一点。
与Java相比,最好使用一些本机方法

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

关联WMI类将计算机系统与该系统上的用户帐户相关联

抽象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();
    }
}
}

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

关联WMI类将计算机系统与该系统上的用户帐户相关联

抽象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();
    }
}
}

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

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,并将其返回给调用者。

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

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并将其返回给调用方。

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

}

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

}

你能提供完整的代码示例吗?我不熟悉Jacob和COM其他答案中的代码不正确完整示例不可用,也许类似这样的线索会有所帮助。Jacob现在在。如何获取PartComponent的Name属性?解决:我可以将Win32_SystemUsers替换为Win32_UserAccount,将PartComponent替换为Name。另外,你应该删除break;从代码中删除@akapelko-break。很高兴你能用这个例子-你能提供完整的代码示例吗?我不熟悉Jacob和COM其他答案中的代码不正确完整示例不可用,也许类似这样的线索会有所帮助。Jacob现在在。如何获取PartComponent的Name属性?解决:我可以将Win32_SystemUsers替换为Win32_UserAccount,将PartComponent替换为Name。另外,你应该删除break;从代码中删除@akapelko-break。很高兴你能用这个例子-