2015-01-16 4 views
7

मुझे वर्तमान उपयोगकर्ता का डिस्प्ले नाम प्राप्त करने की आवश्यकता है, और वह समाधान नहीं ढूंढ सकता जो हमेशा काम करता है। बस स्पष्टता के लिए, मैं उपयोगकर्ता नाम की तलाश नहीं कर रहा हूं। मुझे "जॉन डो" की ज़रूरत है। स्टार्ट मेनू पर प्रदर्शित मूल्य।विंडोज उपयोगकर्ता डिस्प्ले नाम प्राप्त करने का एक विश्वसनीय तरीका

इस प्रश्न के बारे में कई पोस्ट हैं हालांकि किसी ने भी मेरी समस्या का समाधान नहीं किया है।

Get Windows User Display Name

How do I get the AD Display Name of the currently logged in user

इन दो पदों मुझे करने के लिए नेतृत्व:

PrincipalContext context = domain.Equals(Environment.MachineName, StringComparison.CurrentCultureIgnoreCase) ? 
    new PrincipalContext(ContextType.Machine) : 
    new PrincipalContext(ContextType.Domain, domain); 

UserPrincipal userPrincipal = new UserPrincipal(context) { SamAccountName = username }; 
PrincipalSearcher searcher = new PrincipalSearcher(userPrincipal); 
userPrincipal = searcher.FindOne() as UserPrincipal; 

string displayName = userPrincipal.DisplayName; 

और यह कोड अधिकांश भाग के लिए काम करता है। हालांकि अगर उपयोगकर्ता ने अपने कंप्यूटर पर सर्वर सेवा को अक्षम/बंद कर दिया है तो मुझे एक अपवाद मिलता है कि "सर्वर सेवा शुरू नहीं हुई है।"

System.DirectoryServices.AccountManagement.UserPrincipal.Current.DisplayName 

वही त्रुटि।

How to get logged-in user's full name in windows?

StringBuilder name = new StringBuilder(1024); 
uint userNameSize = (uint)name.Capacity; 
const int NameDisplay = 3; 
GetUserNameEx(NameDisplay, name, ref userNameSize) 

रिटर्न कोई त्रुटि है, लेकिन कोई रिक्त स्ट्रिंग यदि उपयोगकर्ता किसी डोमेन में नहीं है।

How do you read the user's display (first and last) name on all versions of Windows reliably?

// get SAM compatible name <server/machine>\\<username> 
if (0 != GetUserNameEx(2, username, ref userNameSize)) 
{ 
    IntPtr bufPtr; 
    try 
    { 
     string domain = Regex.Replace(username.ToString(), @"(.+)\\.+", @"$1"); 
     DirectoryContext context = new DirectoryContext(DirectoryContextType.Domain, domain); 
     DomainController dc = DomainController.FindOne(context); 

     if (0 == NetUserGetInfo(dc.IPAddress, 
        Regex.Replace(username.ToString(), @".+\\(.+)", "$1"), 
        10, out bufPtr)) 
     { 
      var userInfo = (USER_INFO_10) Marshal.PtrToStructure(bufPtr, typeof (USER_INFO_10)); 
      return Regex.Replace(userInfo.usri10_full_name, @"(\S+), (\S+)", "$2 $1"); 
     } 
    } 
    finally 
    { 
     NetApiBufferFree(out bufPtr); 
    } 
} 
ऊपर मैं संदेश के साथ एक ActiveDirectoryObjectNotFoundException मिल "डोमेन नियंत्रक डोमेन में नहीं मिला .." जब DomainController.FindOne कहा जाता है के साथ

मुझे डिस्प्ले नाम के लिए रजिस्ट्री सेटिंग नहीं मिली है।

मुझे नहीं पता कि और क्या प्रयास करना है। कृपया मदद करे।

+1

मुझे नहीं पता कि आपको 100% समाधान मिलेगा या नहीं; फिर फिर, आप कुछ शाखा मामलों के साथ क्या संभावनाएं देखते हैं (उदा। उपयोगकर्ता डोमेन पर नहीं)? यदि प्रभाव केवल कुछ उपयोगकर्ता होंगे तो यह प्रयास के लायक नहीं हो सकता है। –

उत्तर

3

उपरोक्त सभी विधियां केवल तभी काम करेंगी जब आप किसी डोमेन पर हों। यदि आप नहीं हैं, तो आपको स्थानीय उपयोगकर्ता खाता स्टोर पर भरोसा करना चाहिए। निम्नलिखित जानकारी इस जानकारी को कैसे प्राप्त करें: How can I get a list Local Windows Users (Only the Users that appear in the windows Logon Screen)। हालांकि एक डोमेन स्थिति में, उपयोगकर्ता खाता स्थानीय स्टोर में नहीं होगा।

यदि आप डोमेन पर हैं लेकिन डोमेन नियंत्रक से कनेक्ट नहीं हैं, तो प्रदर्शन नाम आपके लिए आसानी से उपलब्ध नहीं होगा। यह जानकारी डोमेन नियंत्रक पर संग्रहीत है, न कि स्थानीय उपयोगकर्ता के कंप्यूटर पर। यदि आपके उपयोगकर्ता डोमेन पर हैं, तो वे वास्तव में सर्वर सेवा को अक्षम करने में सक्षम नहीं होना चाहिए (GPOs का उपयोग करें)। साथ ही, वे उस सेवा को अक्षम करके अपने उपयोगकर्ता खाते को पुनर्प्राप्त करने की क्षमता से कहीं अधिक खो देते हैं।

मैं प्रदर्शन नाम प्राप्त करने से पहले डोमेन उपलब्धता की जांच करूंगा। यदि यह विफल रहता है, तो विफलता का संकेत देने वाला एक संदेश प्रदर्शित करें। यहां उन सभी के लिए लेखांकन करने के लिए संभावित रूप से कई किनारों के मामले हैं। उस परिदृश्य के साथ जाएं जिसका आप प्रोग्राम का उपयोग करना चाहते हैं, और दूसरों के लिए एक त्रुटि संदेश दें।

संबंधित मुद्दे

 संबंधित मुद्दे