Используя Java, Как я могу получить список всех локальных пользователей на машине с Windows - PullRequest
1 голос
/ 02 декабря 2008

Как я могу перечислить всех локальных пользователей, настроенных на машине Windows (Win2000 +), используя Java.
Я бы предпочел сделать это с использованием любых мостов java 2 com или любой другой сторонней библиотеки, если это возможно.
Желательно какой-то нативный метод для Java.

Ответы [ 3 ]

3 голосов
/ 02 декабря 2008

Использование Java-COM Bridge, например Jacob . Затем вы выбираете подходящую библиотеку COM, например, COM API для WMI для вывода списка локальных пользователей или любой другой информации управления Windows.

Класс WMI ассоциации Win32_SystemUsers связывает компьютерную систему и учетную запись пользователя в этой системе.

Абстрактный класс WMI Win32_Account содержит информацию об учетных записях пользователей и групповых учетных записях, известных компьютерной системе под управлением 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 голосов
/ 11 мая 2012

Использование 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);
    } 

}
0 голосов
/ 02 декабря 2008

Есть более простое решение для того, что мне нужно.
Эта реализация будет использовать команду " 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 процесса и возвращает его вызывающей стороне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...