2009-07-31 22 views
14

पूर्वापेक्षा विस्तारवर्तमान उपयोगकर्ता के एसआईडी को पाने का सबसे अच्छा तरीका क्या है?

  1. .NET 2.0 में कार्य करना।
  2. कोड एक सामान्य पुस्तकालय में है जिसे एएसपी.Net, विंडोज फॉर्म, या कंसोल एप्लिकेशन से बुलाया जा सकता है।
  3. किसी कॉर्पोरेट नेटवर्क पर Windows डोमेन में चल रहा है।

प्रश्न

सबसे अच्छा तरीका है वर्तमान उपयोगकर्ता का SID पाने के लिए क्या है? मैं उस एप्लिकेशन के बारे में बात नहीं कर रहा हूं जो एप्लिकेशन को निष्पादित कर रहा है, लेकिन वह उपयोगकर्ता जो इंटरफ़ेस तक पहुंच रहा है। पृष्ठभूमि अनुप्रयोगों और डेस्कटॉप आधारित अनुप्रयोगों में यह वास्तव में एप्लिकेशन को निष्पादित करने वाली पहचान होनी चाहिए, लेकिन एएसपी.Net (बिना छेड़छाड़ के) में यह HttpContext.Current.User SID होना चाहिए।

वर्तमान विधि

यह वही है मैं अभी मिल गया है है। ऐसा लगता है ... गलत। वो बहुत बेकार है। क्या ऐसा करने का कोई बेहतर तरीका है, या कुछ कक्षा में निर्मित है जो आपके लिए करता है?

public static SecurityIdentifier SID 
{ 
    get 
    { 
     WindowsIdentity identity = null; 

     if (HttpContext.Current == null) 
     { 
      identity = WindowsIdentity.GetCurrent(); 
     } 
     else 
     { 
      identity = HttpContext.Current.User.Identity as WindowsIdentity; 
     } 

     return identity.User; 
    } 
} 

उत्तर

3

मुझे नहीं लगता कि इस जानकारी में हो रही पर एक बेहतर तरीका है - you've किसी भी तरह WindowsPrincipal पर प्राप्त करने के लिए मिला है और नेट के बजाय साफ एपीआई सार उपयोगकर्ता वस्तु के पीछे है। मैं बस इस विधि को छोड़ दूंगा और एक विधि में लपेटूंगा और इसे एक दिन बुलाऊंगा।

ठीक है, ठीक है, वहाँ एक बात आपको क्या करना चाहिए है, जो अशक्त पहचान के लिए जाँच करें और जो कुछ नियम आप के अनुसार इसे संभाल करने के लिए किया जाएगा (जब तक अपने वेब उपयोगकर्ताओं हमेशा WindowsIdentity होने जा रहा हैं)।

+1

उपयोगकर्ता के पास हमेशा एक पहचान होगी (यदि वे तब नहीं करते हैं तो यह एक बड़ी समस्या है)। जवाब के लिए धन्यवाद। –

1

विंडोज इडेंटिटी क्लास "कक्षा में निर्मित है जो आपके लिए यह करता है"। जब तक आपके पास काम करने के लिए एक वैध WindowsIdentity है, तब तक आपको वास्तव में एक समाधान मिल जाएगा जैसा कि आप वास्तव में प्राप्त करने जा रहे हैं।

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

0

तृतीय-पक्ष पुस्तकालयों के उपयोग के बिना यह कोड सही परिणाम देगा, यदि उपयोगकर्ता ने अपना उपयोगकर्ता नाम बदल दिया है।

String SID = ""; 
string currentUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString(); 

RegistryKey regDir = Registry.LocalMachine; 

      using (RegistryKey regKey = regDir.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData", true)) 
      { 
       if (regKey != null) 
       { 
        string[] valueNames = regKey.GetSubKeyNames(); 
        for (int i = 0; i < valueNames.Length; i++) 
        { 
         using (RegistryKey key = regKey.OpenSubKey(valueNames[i], true)) 
         { 
          string[] names = key.GetValueNames(); 
          for (int e = 0; e < names.Length; e++) 
          { 
           if (names[e] == "LoggedOnSAMUser") 
           { 
            if (key.GetValue(names[e]).ToString() == currentUserName) 
             SID = key.GetValue("LoggedOnUserSID").ToString(); 
           } 
          } 
         } 
        } 
       } 
      }MessageBox.Show(SID); 
संबंधित मुद्दे