2

Java を使用して Windows マシン (Win2000+) で構成されているすべてのローカル ユーザーを一覧表示するにはどうすればよいですか。
可能であれば、Java 2 com ブリッジまたはその他のサードパーティ ライブラリを使用して、これを行うことをお勧めします。
Java よりも好ましいいくつかのネイティブ メソッド。

4

4 に答える 4

3

Jacobのような Java-COM Bridge を使用します。次に、適切な 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();
    }
}
}
于 2008-12-02T12:55:58.147 に答える
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);
    } 

}
于 2012-05-10T20:36:18.530 に答える
1

私が必要としていたものに対するより簡単な解決策があります。
この実装では、「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 を収集して呼び出し元に返します。

于 2008-12-02T14:22:05.007 に答える