如何使用Java列出Windows机器(Win2000 +)上配置的所有本地用户。我宁愿使用任何java 2 com桥或任何其他第三方库(如果可能)来进行此操作。最好是Java的一些本地方法。
使用Java-COM Bridge,例如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();
}
}
}
使用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);
}
}
我有一个更简单的解决方案。此实现将使用“ 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,并将其返回给调用者。
import com.sun.jna.platform.win32.Netapi32Util;
Netapi32Util.User[] users = Netapi32Util.getUsers();
for(Netapi32Util.User user : users) {
System.out.println(user.name);
}