मुझे वर्तमान उपयोगकर्ता का डिस्प्ले नाम प्राप्त करने की आवश्यकता है, और वह समाधान नहीं ढूंढ सकता जो हमेशा काम करता है। बस स्पष्टता के लिए, मैं उपयोगकर्ता नाम की तलाश नहीं कर रहा हूं। मुझे "जॉन डो" की ज़रूरत है। स्टार्ट मेनू पर प्रदर्शित मूल्य।विंडोज उपयोगकर्ता डिस्प्ले नाम प्राप्त करने का एक विश्वसनीय तरीका
इस प्रश्न के बारे में कई पोस्ट हैं हालांकि किसी ने भी मेरी समस्या का समाधान नहीं किया है।
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 कहा जाता है के साथ
।
मुझे डिस्प्ले नाम के लिए रजिस्ट्री सेटिंग नहीं मिली है।
मुझे नहीं पता कि और क्या प्रयास करना है। कृपया मदद करे।
मुझे नहीं पता कि आपको 100% समाधान मिलेगा या नहीं; फिर फिर, आप कुछ शाखा मामलों के साथ क्या संभावनाएं देखते हैं (उदा। उपयोगकर्ता डोमेन पर नहीं)? यदि प्रभाव केवल कुछ उपयोगकर्ता होंगे तो यह प्रयास के लायक नहीं हो सकता है। –