Tên máy hiện tại của Java và người dùng đã đăng nhập?


153

Có thể lấy tên của người dùng hiện đang đăng nhập (Windows / Unix) và tên máy chủ của máy không?

Tôi giả sử nó chỉ là một thuộc tính của một số lớp môi trường tĩnh.

Tôi đã tìm thấy tên này cho tên người dùng

com.sun.security.auth.module.NTSystem NTSystem = new
        com.sun.security.auth.module.NTSystem();
System.out.println(NTSystem.getName());

và cái này cho tên máy:

import java.net.InetAddress;
...
String computerName;
...
try {
    computerName = InetAddress.getLocalHost().getHostName();
}

catch(Exception ex) {
    ...
}

Là cái đầu tiên chỉ dành cho Windows?

Và cái thứ hai sẽ làm gì, nếu bạn không có bộ tên máy chủ?


Các NTSystemlớp học chỉ tồn tại trên Windowscác bản phân phối JDK
BullyWiiPlaza

Câu trả lời:


256

Để có được người dùng hiện đang đăng nhập:

System.getProperty("user.name"); //platform independent 

và tên máy chủ của máy:

java.net.InetAddress localMachine = java.net.InetAddress.getLocalHost();
System.out.println("Hostname of local machine: " + localMachine.getHostName());

1
System.getProperty("user.name"); hoạt động trên cả windows và linux không?
Cá trê

5
Tuy nhiên, user.namegiá trị có thể bị giả mạo , vì vậy nó không nên được sử dụng để xác thực.
Raedwald

14
System.getProperty ("user.name") hiện chưa được đăng nhập vào người dùng, đó là người dùng trong bối cảnh bảo mật của ai là JVM đang chạy.
rkosegi

1
Đối với những gì OP gọi là "tên máy" hoặc "tên máy tính" thì câu trả lời này không chính xác. Java không có cách nào để có được "tên máy tính", tức là tên được gán cho máy tính từ rất sớm trong quá trình khởi động và không liên quan đến mạng. Tất cả các hệ điều hành đều có khái niệm này, nhưng thật không may, giá trị này không được hiển thị trong Java. Tuy nhiên thường - nhưng không phải lúc nào - phương pháp trên thực sự sẽ trả về tên máy tính. Xem stackoverflow.com/a/40702767/1504556 để được giải thích.
peterh

91

Để có được người dùng hiện đang đăng nhập:

System.getProperty("user.name");

Để có được tên máy chủ của máy:

InetAddress.getLocalHost().getHostName();

Để trả lời phần cuối của câu hỏi của bạn, API Java nói rằng gethostName () sẽ trả về

tên máy chủ cho địa chỉ IP này hoặc nếu hoạt động không được phép kiểm tra bảo mật, thì việc thể hiện bằng văn bản của địa chỉ IP.


Upvote để trả lời tất cả các câu hỏi ban đầu của OP một cách rõ ràng và chính xác. Chắc chắn đây sẽ là câu trả lời được chấp nhận
Andy

1
Đồng ý với @Andy - bỏ phiếu cho câu trả lời rõ ràng và súc tích cho tất cả các điểm.
Paul Eden

9

Sử dụng user.namekhông an toàn vì các biến môi trường có thể bị làm giả. Phương pháp bạn đang sử dụng là tốt, cũng có các phương pháp tương tự cho hệ điều hành dựa trên unix


Vì vậy, đây chỉ cho các cửa sổ? Có một cách độc lập nền tảng để làm điều này?
Stuart R. Jefferys

7
Thuộc tính hệ thống không phải là biến môi trường. Sử dụng System.getenv ("USER") cho các biến môi trường. Người dùng vẫn có thể đặt System.properies trên dòng lệnh java với java -Duser.name = someoneelse nên vẫn không an toàn
dan carter

"Có các phương pháp tương tự cho hệ điều hành dựa trên unix": Cảm ơn, những gì tôi đã tìm kiếm. Vậy phương pháp cho các HĐH này là gì? nghiên cứu của tôi, hiện đang tiến hành tôi ... ở đây :) bằng cách sử dụng "whoami"?
pdem

Xin lỗi vì thư rác, tôi đến đây để đưa ra một loại giải pháp trong C :: stackoverflow.com/questions/1451825/. Vì vậy, về cơ bản, chúng tôi phải sử dụng whoami hoặc JNI với mã C "getpwuid (getuid ())" . Không còn lớp UnixSystem nữa.
pdem

0

Để có được đường dẫn người dùng hiện đang đăng nhập:

System.getProperty("user.home");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.