ชื่อเครื่องปัจจุบัน Java และผู้ใช้ที่เข้าสู่ระบบ?


153

เป็นไปได้หรือไม่ที่จะได้รับชื่อผู้ใช้ที่ล็อกอินอยู่ในปัจจุบัน (Windows / Unix) และชื่อโฮสต์ของเครื่อง?

ฉันคิดว่ามันเป็นเพียงคุณสมบัติของคลาสสภาพแวดล้อมแบบคงที่

ฉันพบสิ่งนี้สำหรับชื่อผู้ใช้

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

และนี่สำหรับชื่อเครื่อง:

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

catch(Exception ex) {
    ...
}

คนแรกสำหรับ Windows ใช่หรือไม่

และอันที่สองจะทำอะไรถ้าคุณยังไม่มีชื่อโฮสต์


NTSystemชั้นเดียวอยู่ในWindowsการกระจาย JDK
BullyWiiPlaza

คำตอบ:


256

ในการรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน:

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

และชื่อโฮสต์ของเครื่อง:

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

1
ไม่System.getProperty("user.name"); ทำงานได้ทั้งบน Windows และ Linux?
ปลาดุก

5
อย่างไรก็ตามuser.nameค่าสามารถปลอมแปลงดังนั้นจึงไม่ควรใช้สำหรับการตรวจสอบ
Raedwald

14
System.getProperty ("user.name") ไม่ได้ลงชื่อเข้าใช้ในขณะนี้ผู้ใช้ภายใต้บริบทความปลอดภัยของใครที่ JVM ทำงานอยู่
rkosegi

1
ส่วนคำว่า OP หมายถึง "ชื่อเครื่อง" หรือ "ชื่อคอมพิวเตอร์" คำตอบนี้ไม่ถูกต้อง Java ไม่มีทางที่จะได้รับ "ชื่อคอมพิวเตอร์" คือชื่อที่กำหนดให้กับคอมพิวเตอร์ในช่วงต้นของกระบวนการบู๊ตและไม่เกี่ยวข้องกับเครือข่าย ระบบปฏิบัติการทั้งหมดมีแนวคิดนี้ แต่น่าเสียดายที่ค่านี้ไม่ได้แสดงใน Java อย่างไรก็ตามบ่อยครั้งที่ - แต่ไม่เสมอไป - วิธีการด้านบนจะส่งคืนชื่อคอมพิวเตอร์ ดูstackoverflow.com/a/40702767/1504556สำหรับคำอธิบาย
เตอร์

91

ในการรับผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน:

System.getProperty("user.name");

ในการรับชื่อโฮสต์ของเครื่อง:

InetAddress.getLocalHost().getHostName();

เพื่อตอบคำถามสุดท้ายของคุณJava APIบอกว่า getHostName () จะกลับมา

ชื่อโฮสต์สำหรับที่อยู่ IP นี้หรือหากการดำเนินการไม่ได้รับอนุญาตจากการตรวจสอบความปลอดภัยการแสดงข้อความของที่อยู่ IP


โหวตขึ้นสำหรับการตอบคำถามต้นฉบับทั้งหมดของ OPs หนึ่งแถบอย่างชัดเจนและรัดกุม แน่นอนว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Andy

1
เห็นด้วยกับ @Andy - up-vote เพื่อคำตอบที่ชัดเจนและรัดกุมในทุกประเด็น
Paul Eden

9

การใช้user.nameไม่ปลอดภัยเนื่องจากตัวแปรสภาพแวดล้อมสามารถปลอมแปลงได้ วิธีการที่คุณใช้นั้นดีมีวิธีการที่คล้ายกันสำหรับระบบปฏิบัติการแบบยูนิกซ์เช่นกัน


ดังนั้นนี่เป็นเพียง windows? มีวิธีที่เป็นอิสระในการทำแพลตฟอร์มนี้หรือไม่?
Stuart R. Jefferys

7
คุณสมบัติของระบบไม่ใช่ตัวแปรสภาพแวดล้อม ใช้ System.getenv ("USER") สำหรับตัวแปรสภาพแวดล้อม ผู้ใช้ยังสามารถตั้งค่า System.properties บน commandline java ด้วย java -Duser.name = someelse ดังนั้นจึงไม่ปลอดภัย
dan carter

"มีวิธีการที่คล้ายกันสำหรับระบบปฏิบัติการยูนิกซ์เช่นกัน": ขอบคุณสิ่งที่ฉันกำลังมองหา ดังนั้นวิธีการสำหรับระบบปฏิบัติการเหล่านี้คืออะไร? การวิจัยของฉันดำเนินการในปัจจุบันฉัน ... ที่นี่ :) ใช้ "whoami"?
pdem

ขออภัยที่สแปมฉันมาที่นี่เพื่อให้วิธีการแก้ปัญหาใน C:: stackoverflow.com/questions/1451825/ …ดังนั้นโดยพื้นฐานเราต้องใช้ whoami หรือ JNI ด้วยรหัส C "getpwuid (getuid ())" . ไม่มีคลาส UnixSystem อีกต่อไป
pdem

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.