2009-04-28 37 views
71

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

यह

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 मिल जब मैं इस कोड चलाने का प्रयास कोड मैं कोशिश की है है ...। क्या कोई मुझे बता सकता है कि मैं सही दिशा में जा रहा हूं, और समस्या को समझने में मेरी मदद करता हूं।

+2

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

+0

कोई विवरण पोस्ट नहीं होने पर कुछ भी समझना असंभव है –

+0

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

उत्तर

175
System.getProperty("user.name") 
+3

+1 आप –

+0

के साथ वीएम शुरू करने के लिए बहुत सारी सूचनाएं प्राप्त करने के लिए System.properties प्रिंट कर सकते हैं धन्यवाद!मैं फ्लैश/एक्शनस्क्रिप्ट से आया हूं ... इसलिए मुझे कवर करने के लिए एक looooooot मिला है :) –

+1

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

27
यूनिक्स में

:

new com.sun.security.auth.module.UnixSystem().getUsername() 
Windows में

:

new com.sun.security.auth.module.NTSystem().getName() 
सोलारिस में

:

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

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

+12

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

+6

@ChinmayKanchi: यदि कोई उपयोगकर्ता नाम नहीं है, तो 'user.name' प्रॉपर्टी सिर्फ शून्य होनी चाहिए। मैं @ जेनकिम से सहमत हूं, ओएस-निर्भर सामान न लिखें। –

14

System.getProperty ("user.name") एक नहीं है अच्छा सुरक्षा विकल्प क्योंकि उस पर्यावरण चर को फिक किया जा सकता है: सी:

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

JDK 1.5 और अधिक से अधिक: \ सेट USERNAME = "जो डो" जावा ... // आप System.getProperty ("user.name") आप करना चाहिए दे देंगे।

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

+0

काफी आसान +1! धन्यवाद! –

+2

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

+1

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

13

@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)); 
} 
+0

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

+3

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

2

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

System.getProperty ("user.name");

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

1

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

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

+0

'System.getenv (" उपयोगकर्ता नाम ") के बारे में क्या? :) –

5

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

+0

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