জাভাতে লগইন ব্যবহারকারীর নাম পান


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এই কোডটি চালানোর চেষ্টা করার সময় আমি একটি পাই। কেউ দয়া করে আমাকে বলতে পারেন যে আমি সঠিক দিকে যাচ্ছি কিনা, এবং সমস্যাটি বুঝতে আমাকে সহায়তা করুন।


4
আমি আপনাকে ভুল বোঝাতে ভয় পাই, তবে আমি আপনার প্রশ্নটি বুঝতে পারি না। কোন লগইন ব্যবহারকারীর নাম? উইন্ডোজ / জিএনইউ লিনাক্স লগইন? একটি ওয়েব সার্ভারে বেসিক প্রমাণীকরণ?
গেরদা

কোনও বিবরণ পোস্ট করা হয় না তখন কিছু বোঝা অসম্ভব
matt b

দুক্ষিত বন্ধুরা. আমি জাভাতে নতুন আছি এবং এখনই বোধ করা কিছুটা শক্ত।
জর্জ প্রোফেনজা

উত্তর:


225
System.getProperty("user.name")

4
+1 আপনি ভি.এম. দিয়ে শুরু করা প্রচুর তথ্য পেতে সিস্টেম.প্রপার্টি মুদ্রণ করতে পারেন
মার্কাস লসবার্গ

4
আমার জন্য এটি ভিএম চালাচ্ছে ব্যবহারকারীর নাম মুদ্রণ করে। জাভা অ্যাপ্লিকেশনটিতে লগ ইন করা ব্যবহারকারী নয়।
টম ব্রিটো

4
এটি কি বিস্তৃত উপলব্ধ তৃতীয় পক্ষের লাইব্রেরিতে কোথাও সংজ্ঞায়িত করা হয়েছে? বা জেডিকে-তে কোথাও স্থির সংজ্ঞা দেওয়া আছে 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
ব্যবহারকারীর নাম পাওয়ার চেষ্টা করা হচ্ছে সংজ্ঞা প্ল্যাটফর্ম-দ্বারা নির্দিষ্ট। একক ব্যবহারকারী সিস্টেমে চলমান একটি জেভিএমের কোনও ব্যবহারকারীর নাম থাকতে পারে না।
চিন্ময় কাঞ্চি

8
@ চিন্ময়কঞ্চি: যদি কোনও ব্যবহারকারীর নাম না থাকে, তবে user.nameসম্পত্তিটি খালি হওয়া উচিত। আমি @ জিনকিমের সাথে একমত, ওএস-নির্ভর জিনিস লিখবেন না।
মিঃ ল্যান্স ই স্লোয়ান

4
ইউজারআরনাম কমান্ড-লাইনে সেট করা যেতে পারে, তাই এটি ব্যবহারের ক্ষেত্রে কী তা নির্ভর করে
অ্যালিস পার্সেল

4
Com.sun প্যাকেজগুলির অধীনে ক্লাসগুলি কোনও বিকাশকারী দ্বারা ব্যবহার করা উচিত নয়। এগুলি অভ্যন্তরীণ এবং ভবিষ্যতে পরিবর্তিত হতে পারে।
CHiRo79

17

@ নিউওয়া্যাক্টের উত্তরে অনুপ্রাণিত , এমন একটি কোড যা কোনও প্ল্যাটফর্মে সংকলন করা যায়:

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

4
এনটিএস সিস্টেমে ব্যবহারকারীর নামটি "getName ()" নয় "getUsername ()" নয়, এটি উইন্ডোতে ভেঙে যাবে। আমি মনে করি আপনি আরও চেক করতে পারেন এবং তারপরে সঠিক পদ্ধতিটি শুরু করতে পারেন। উদ্ভট এটি যদিও জেআরই দ্বারা কোনও ওএস অজ্ঞোস্টিক পদ্ধতিতে বিমূর্ত নয়?
জন মার্ক স্কার্বারো

4
com.sunক্লাস জাভা 9+ ডিফল্টরূপে প্রবেশযোগ্য নয়। এই সমাধানটি এটির জন্য কার্যকর হবে না।
থান্ডারফোরজ

কিছু নতুন এপিআই যুক্ত করা না হলে, আমি মনে করি জাভা 9 এ কাজ করবে এমন একমাত্র জিনিসটি ডিএফএ এর সমাধান হবে
থান্ডারফোরজ

15

System.getProperty ("user.name") যেহেতু সেই পরিবেশের ভেরিয়েবলটি নকল হতে পারে সেহেতু একটি ভাল সুরক্ষা বিকল্প নয়: সি: USER সেট করা USERNAME = "জো ডো" জাভা ... // আপনাকে System.getProperty ("ব্যবহারকারী) দেবে। নাম ") আপনার করা উচিত:

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

জেডিকে 1.5 এবং আরও বেশি greater

আমি এটি একটি অ্যাপলেটের মধ্যে ব্যবহার করি এবং এটিতে স্বাক্ষর করতে হবে। তথ্য উত্স


4
এটি সম্পূর্ণ সমাধান নয়, কারণ এটি কেবল উইন্ডোজের অধীনে কাজ করে।
মিঃ ল্যান্স ই স্লোয়ান

4
এটি কি খুব ছদ্মবেশী হতে পারে, যেমন কাস্টম ক্লাসলোডার বা শ্রেণিপথে com.sun.security.auth.module.NYSystemউচ্চতর কাস্টম প্রয়োগের সাথে ? জাভা রানটাইম এই জাতীয় শোষণের বিরুদ্ধে রোধ করার চেষ্টা করে কিনা আমি জানি না, তবে আমি মনে করি না যে সম্ভাব্য-দূষিত ক্লায়েন্টের অ্যাক্সেসযোগ্য কোনও বাক্সে কোড চালানো ছাড়া এটিকে 'সুরক্ষিত' করার কোনও অপ্রয়োজনীয় উপায় আছে I ।
বেকার

4
আমি কেবলমাত্র পাওয়ারমক (যা আমি বিশ্বাস করি একটি কাস্টম শ্রেণি লোডার ব্যবহার করে) ব্যবহার করে এনটিএসটিস্টেম.জেটনেম () এর বাস্তবায়ন প্রতিস্থাপনে সফলভাবে পরিচালিত হয়েছি, সুতরাং আপনি 'সুরক্ষা' এর জন্য এই জাতীয় কোনও কিছুর উপর নির্ভর করতে পারবেন না ... তবে আমি জানি না অ্যাপলেট বিশ্বে কীভাবে জিনিস রয়েছে। আমি ভাবতাম যে কেউ যদি কাস্টম সিস্টেমের বৈশিষ্ট্য সরবরাহ করতে পারে তবে তারা কাস্টম ক্লাস বা কাস্টম শ্রেণিবদ্ধও সরবরাহ করতে পারে।
বেকার

4
-1 কারণ এটি কেবল উইন্ডোজে কাজ করে। আপনার এটি ব্যবহার করা উচিত নয়।
stommestack

@ ব্যাকার: আমি একমত, যে এর উপর নির্ভর করা উচিত নয় এবং ভাবতে হয় যে এটি বেশ সুরক্ষিত is তবে আমার মতে সুরক্ষা প্রায় "স্তর"। কোনও পদ্ধতির পাওয়ারমকিংয়ের চেয়ে পরিবেশের পরিবর্তনশীল পরিবর্তন করা সহজ। একটি নন-আইটি সংস্থায় এনটিএসসিস্টেম ব্যবহার করে পরিবেশের পরিবর্তের পরিবর্তে পরিবেশের পরিবর্তনশীলের চেয়ে বেশি লোকেরা এটি টানতে সক্ষম লোকের পরিমাণ অর্ধেক করে দেয়: পি। সুতরাং আপনি কিছুটা বেশি সুরক্ষা পেতে পারেন তবে পরিবর্তে রাস্তায় কিছু জাভা কনভেনশন হারাবেন।
ক্যালন

6

জেএনএ এর সহজ ব্যবহার:

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


4
আপনি কোনও ডোমেন ব্যবহারকারী হিসাবে লগ ইন থাকলে এটি কার্যকর হয় না তবে একই নামের স্থানীয় ব্যবহারকারীও রয়েছে। getAccountByName স্থানীয় ব্যবহারকারীর জন্য তথ্য ফিরিয়ে দেবে।
ডেভ

2

'সেট ব্যবহারকারীর নাম = "ব্যবহারকারীর নাম"' একটি অস্থায়ী ওভাররাইড যে শুধুমাত্র যতদিন বিদ্যমান cmd কমান্ড উইন্ডোজ এখনও পর্যন্ত একবার এটি বন্ধ নিহত হয়, পরিবর্তনশীল মান হারায় হয়। সুতরাং আমি মনে করি

System.getProperty ("user.name");

এখনও ব্যবহার করার জন্য একটি সংক্ষিপ্ত এবং সুনির্দিষ্ট কোড।


1

System.getenv().get("USERNAME"); - উইন্ডোতে কাজ করে!

পরিবেশগত বৈশিষ্ট্যগুলিতে কম্পিউটার এবং হোস্ট সম্পর্কে আপনার প্রয়োজনীয় তথ্য রয়েছে! আমি আবার বলছি! উইন্ডোতে কাজ করে!


কি হবে System.getenv("username")? :)
রোমানিয়া_আজ্ঞানী

উইন্ডোজ পরিষেবা হিসাবে ভিএম - টমক্যাট বলুন - ডোনসের কাজটি উইন্ডোজ পরিষেবা হিসাবে শুরু করা হলে এটিতে হোস্টের নাম অন্তর্ভুক্ত রয়েছে এমন কিছু ফিরে আসে
দীপক

0

নীচে কেবল উইন্ডোজের সমাধান রয়েছে

উইন্ডোজ পরিষেবা হিসাবে অ্যাপ্লিকেশনটি (টমক্যাটের মতো) শুরু হওয়া ক্ষেত্রে, সিস্টেম.জেটপ্রোপার্টি ("ব্যবহারকারীর নাম") বা সিস্টেম.জটেনভ () পাওয়া ("ব্যবহারকারী নাম") পরিষেবাটি চালু করা ব্যবহারকারীকে ফিরিয়ে দেবে এবং না বর্তমান ব্যবহারকারীর নাম লগ ইন।

এছাড়াও জাভা 9 এ এনটিএস সিস্টেম ইত্যাদি ক্লাস অ্যাক্সেসযোগ্য হবে না

উইন্ডোগুলির জন্য কাজ করার মতো: আপনি ডাব্লুএমআই ব্যবহার করতে পারেন , সুতরাং আপনাকে নীচের কমান্ডটি চালাতে হবে

wmic ComputerSystem get UserName

যদি উপলভ্য থাকে তবে এটি ফর্মের আউটপুট ফেরত দেবে:

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

দ্রষ্টব্য: উইন্ডোগুলির জন্য আপনাকে একটি উপসর্গ হিসাবে সেন্টিমিটার / সি ব্যবহার করতে হবে, সুতরাং নীচে উদাহরণ হিসাবে একটি ক্রুড প্রোগ্রাম রয়েছে:

    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());
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.