जावा में लॉगिन उपयोगकर्ता नाम प्राप्त करें


92

मैं जावा में उपयोगकर्ता नाम / लॉगिन नाम कैसे प्राप्त कर सकता हूं?

यह वह कोड है जिसे मैंने आज़माया है ...

try{
    LoginContext lc = new LoginContext(appName,new TextCallbackHandler());
    lc.login();
    Subject subject = lc.getSubject();
    Principal principals[] = (Principal[])subject.getPrincipals().toArray(new Principal[0]);

    for (int i=0; i<principals.length; i++) {
        if (principals[i] instanceof NTUserPrincipal || principals[i] instanceof UnixPrincipal) {
            String loggedInUserName = principals[i].getName();
        }
    }

}
catch(SecurityException se){
    System.out.println("SecurityException: " + se.getMessage());
}

SecurityExceptionइस कोड को चलाने का प्रयास करने पर मुझे मिल जाता है । क्या कोई मुझे बता सकता है कि क्या मैं सही दिशा में जा रहा हूं, और समस्या को समझने में मेरी मदद करें।


3
मैं आपको गलत समझने से डरता हूं, लेकिन मैं आपके सवाल को नहीं समझता। कौन सा लॉगिन उपयोगकर्ता नाम? विंडोज / GNU लिनक्स लॉगिन? वेबसर्वर पर मूल प्रमाणीकरण?
ग्वारडा

जब कोई विवरण पोस्ट नहीं किया जाता है तो कुछ भी समझना असंभव है
मैट बी

क्षमा करें दोस्तों। मैं जावा के लिए नया हूं और अब समझ में आना थोड़ा मुश्किल है।
जॉर्ज प्रोफेनो

जवाबों:


224
System.getProperty("user.name")

4
+1 आप सिस्टम को प्रिंट कर सकते हैं। वीएम को शुरू करने के लिए बहुत सारे informations
मिलते हैं

3
मेरे लिए यह VM को निष्पादित करने वाले उपयोगकर्ता के नाम को प्रिंट करता है। जावा एप्लिकेशन पर उपयोगकर्ता लॉग इन नहीं है।
टॉम ब्रिटो

1
क्या यह कहीं भी व्यापक रूप से उपलब्ध थर्ड पार्टी लाइब्रेरी में परिभाषित है? या क्या user.nameसंपत्ति के नाम पर जेडीके द्वारा प्रदान की गई कक्षाओं में कहीं भी एक निरंतर परिभाषित है ?
जेफ इवांस

29

यूनिक्स में:

new com.sun.security.auth.module.UnixSystem().getUsername()

विंडोज में:

new com.sun.security.auth.module.NTSystem().getName()

सोलारिस में:

new com.sun.security.auth.module.SolarisSystem().getUsername()

49
यह कोड एक बार लिखने के जावा के दर्शन के खिलाफ जाता है, कहीं भी (ओएस विशिष्ट कोड का परिचय) चलाता है, और दूसरी बात, यह जावा के सूर्य के कार्यान्वयन पर निर्भरता पैदा करता है।
जिन किम

14
उपयोगकर्ता नाम प्राप्त करने की कोशिश परिभाषा-विशिष्ट द्वारा की गई है। एकल-उपयोगकर्ता प्रणाली पर चलने वाले JVM में उपयोगकर्ता नाम नहीं हो सकता है।
चिन्मय कांची

8
@ChinmayKanchi: यदि कोई उपयोगकर्ता नाम नहीं है, तो user.nameसंपत्ति बस अशक्त होनी चाहिए। मैं @JKKim से सहमत हूं, OS पर निर्भर चीजें नहीं लिखता।
LS

2
user.name को कमांड-लाइन पर सेट किया जा सकता है, इसलिए यह बहुत हद तक निर्भर करता है कि उपयोग-केस क्या है
ऐलिस परसेल

3
Com.sun पैकेज के तहत कक्षाएं, एक डेवलपर द्वारा उपयोग नहीं की जानी चाहिए। वे आंतरिक हैं और भविष्य में बदल सकते हैं।
CHiRo79

17

@newacct के उत्तर से प्रेरित , एक कोड जिसे किसी भी मंच में संकलित किया जा सकता है:

String osName = System.getProperty( "os.name" ).toLowerCase();
String className = null;
String methodName = "getUsername";

if( osName.contains( "windows" ) ){
    className = "com.sun.security.auth.module.NTSystem";
    methodName = "getName";
}
else if( osName.contains( "linux" ) ){
    className = "com.sun.security.auth.module.UnixSystem";
}
else if( osName.contains( "solaris" ) || osName.contains( "sunos" ) ){
    className = "com.sun.security.auth.module.SolarisSystem";
}

if( className != null ){
    Class<?> c = Class.forName( className );
    Method method = c.getDeclaredMethod( methodName );
    Object o = c.newInstance();
    System.out.println( method.invoke( o ) );
}

प्रतिबिंब का अच्छा उपयोग :)
Zizouz212

5
यह विंडोज पर टूट जाएगा क्योंकि NTSystem पर उपयोगकर्ता नाम पाने के लिए विधि "getName ()" है और "getUsername ()" नहीं है। मुझे लगता है कि आप आगे की जाँच कर सकते हैं और फिर सही विधि लागू कर सकते हैं। विचित्र यह JRE द्वारा एक ओएस अज्ञेय तंत्र में अमूर्त नहीं है, हालांकि?
जॉन मार्क स्कारबोरो

1
com.sunवर्गों जावा 9+ में डिफ़ॉल्ट रूप से सुलभ नहीं हैं। यह समाधान इसके लिए काम नहीं करेगा।
थंडरफोर्ज

जब तक कुछ नया एपीआई नहीं जोड़ा गया था, मुझे लगता है कि जावा 9 में काम करने वाली एकमात्र चीज dfa का समाधान होगी
थंडरफोर्ज

15

System.getProperty ("user.name") एक अच्छा सुरक्षा विकल्प नहीं है क्योंकि उस वातावरण चर को faked किया जा सकता है: C: \ set USERNAME = "जो डो" जावा ... // आपको System.getProperty ("उपयोगकर्ता") देगा। नाम ") आपको करना चाहिए:

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

जेडीके 1.5 और अधिक।

मैं इसे एक एप्लेट के भीतर उपयोग करता हूं, और इसे हस्ताक्षरित करना होगा। जानकारी का स्रोत


4
यह एक पूर्ण समाधान नहीं है, क्योंकि यह केवल विंडोज के तहत काम करता है।
एलएस

1
क्या यह भी खराब हो सकता है, उदाहरण के लिए एक कस्टम क्लास लोडर या com.sun.security.auth.module.NYSystemउच्च वर्ग के कस्टम कार्यान्वयन के साथ ? मुझे नहीं पता कि जावा रनटाइम इस तरह के कारनामों के खिलाफ रोकने की कोशिश करता है, लेकिन मुझे नहीं लगता है कि संभावित-दुर्भावनापूर्ण ग्राहक के लिए दुर्गम एक बॉक्स पर कोड को छोड़कर इसे 'सुरक्षित' बनाने के लिए कोई भी अक्षम रास्ता नहीं होगा। ।
बैकर

4
मैं अभी सफलतापूर्वक NTSystem.getName () का उपयोग करके PowerMock (जो मेरा मानना ​​है कि एक कस्टम क्लास लोडर का उपयोग करता है) के कार्यान्वयन को बदलने में कामयाब रहा है, इसलिए आप वास्तव में 'सुरक्षा' के लिए इस तरह के कुछ पर भरोसा नहीं कर सकते ... हालांकि मुझे नहीं पता कैसे एप्लेट की दुनिया में चीजें हैं। मैंने सोचा होगा कि यदि कोई कस्टम सिस्टम गुण प्रदान कर सकता है तो वे कस्टम क्लास या कस्टम क्लास लोडर भी प्रदान कर सकते हैं।
बैकर

1
-1 क्योंकि यह केवल विंडोज पर काम करता है। आपको इसका उपयोग नहीं करना चाहिए।
स्टॉमेस्टैक

@ बबेर: मैं सहमत हूँ, कि किसी को इस पर भरोसा नहीं करना चाहिए और सोचना चाहिए कि एक बहुत सुरक्षित है। लेकिन मेरी राय में सुरक्षा "स्तरों" के बारे में है। और यह एक तरीका powermocking की तुलना में पर्यावरण चर को बदलने के लिए आसान है। एक गैर-आईटी कंपनी में पर्यावरण चर के बजाय NTSystem का उपयोग करने से अधिक लोगों की राशि है जो इसे खींचने में सक्षम हैं: पी। तो आपको थोड़ी अधिक सुरक्षा मिलती है, लेकिन सड़क पर कुछ जावा सम्मेलनों को खो देते हैं।
कैलोन

6

JNA का प्रयोग सरल है:

String username = Advapi32Util.getUserName();
System.out.println(username);

Advapi32Util.Account account = Advapi32Util.getAccountByName(username);
System.out.println(account.accountType);
System.out.println(account.domain);
System.out.println(account.fqn);
System.out.println(account.name);
System.out.println(account.sidString);

https://github.com/java-native-access/jna


1
यदि आप एक डोमेन उपयोगकर्ता के रूप में लॉग इन हैं तो यह काम नहीं करता है, लेकिन एक ही नाम का एक स्थानीय उपयोगकर्ता भी है। getAccountByName स्थानीय उपयोगकर्ता के लिए जानकारी लौटाएगा।
डेव

2

'सेट प्रयोक्ता नाम = "प्रयोक्ता नाम"' एक अस्थायी ओवरराइड कि केवल तब तक मौजूद है cmd खिड़कियों अभी भी एक बार इसे बंद कर मार दिया जाता है है, वेरिएबल का मान खो देता है के रूप में है। तो मुझे लगता है

System.getProperty ( "user.name");

उपयोग करने के लिए अभी भी एक छोटा और सटीक कोड है।


1

System.getenv().get("USERNAME"); - खिड़कियों पर काम करता है!

पर्यावरण गुणों में आपके पास कंप्यूटर और होस्ट के बारे में आवश्यक जानकारी है! मैं फिर कह रहा हूँ! विन्डोज़ पर काम करता है!


किस बारे में System.getenv("username")? :)
19

अगर वीएम - टॉमकैट कहते हैं, तो डोंस का काम विंडोज सेवा के रूप में शुरू किया गया है, यह कुछ ऐसा है जिसमें मेजबान नाम शामिल है
दीपक

0

नीचे केवल WINDOWS के लिए एक समाधान है

उन मामलों में जहां एप्लिकेशन (जैसे टॉमकैट) एक विंडोज़ सेवा के रूप में शुरू किया गया है, System.getProperty ("user.name") या System.getenv ()। Get ("USERNAME") उस उपयोगकर्ता को लौटाता है जिसने सेवा शुरू की है और नहीं। वर्तमान उपयोगकर्ता नाम में लॉग इन किया।

इसके अलावा जावा 9 में NTSystem आदि की कक्षाएं सुलभ नहीं होंगी

इसलिए विंडोज़ के लिए वर्कअराउंड: आप विकर्म का उपयोग कर सकते हैं , इसलिए आपको नीचे कमांड को चलाना होगा

wmic ComputerSystem get UserName

यदि उपलब्ध है, तो यह फॉर्म का आउटपुट लौटा देगा:

UserName
{domain}\{logged-in-user-name}

नोट: खिड़कियों के लिए आपको उपसर्ग के रूप में cmd ​​/ c का उपयोग करने की आवश्यकता है, इसलिए नीचे एक उदाहरण के रूप में एक क्रूड प्रोग्राम है:

    Process exec = Runtime.getRuntime().exec("cmd /c wmic ComputerSystem get UserName".split(" "));
    System.out.println(exec.waitFor());
    try (BufferedReader bw = new BufferedReader(new InputStreamReader(exec.getInputStream()))) {
        System.out.println(bw.readLine() + "\n" + bw.readLine()+ "\n" + bw.readLine());
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.