2009-05-27 5 views
6

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

यदि आप व्यवस्थापक के रूप में लॉग इन हैं, तो यह सही काम करता है। यदि आप एक सामान्य उपयोगकर्ता संख्या हैं।

मैं अपने आवेदन को व्यवस्थापक क्रेडिट के साथ चलाने के लिए चाहता हूं लेकिन सामान्य उपयोगकर्ता के रूप में जितना संभव हो सके सुरक्षित।

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

+0

आप संभवतः Vista/W7/Server2008 उपयोग कर रहे हैं और आप एक व्यवस्थापक के रूप में लॉग इन किया लेकिन आवेदन w/बाहर उठाया साख चलाता है? – Nate

+0

यह सभी एक्सपी प्रो वर्क स्टेशन है और एडी win2k3 –

उत्तर

1

ऐसा लगता है कि आप व्यवस्थापक उपयोगकर्ता का प्रतिरूपण करना चाहते हैं।यहां एक article and demo है। ऐसा लगता है कि नेट 1 में लिखा जाना चाहिए लेकिन आपको शुरू करना चाहिए। WindowsIdentity कक्षा भी देखें।

+1

इसके साथ समस्या यह है कि यह बहुत पुरानी है और अद्यतित नहीं है। अब तक एक व्यवस्थापक उपयोगकर्ता का प्रतिरूपण करना है कि क्रेडेंशियल्स को गुजरने की आवश्यकता है जो आदर्श नहीं है क्योंकि उन्हें सुरक्षा की आवश्यकता है। – IbrarMumtaz

8

इस एप्लिकेशन के पीछे लक्ष्य मुझे गलत मानता है। आप मूल रूप से गैर-व्यवस्थापक उपयोगकर्ताओं को खातों को अनलॉक करने की अनुमति देने का साधन बनाने की कोशिश कर रहे हैं ... जो कि, अच्छे कारणों से, सामान्य उपयोगकर्ताओं के लिए एक सुविधा उपलब्ध नहीं है।

+2

है मैं आम तौर पर सहमत हूं कि यह एक बुरा विचार है; हालांकि, वह अन्य उपयोगकर्ता खातों को अनलॉक करने के लिए एक पावर उपयोगकर्ता (समर्थन प्रतिनिधि?) को अनुमति दे सकता है, जो पूर्ण प्रशासनिक अधिकार प्रदान करता है। – Nate

+0

क्या उपयुक्त समूह को उचित समूह में निर्दिष्ट नहीं किया जा सकता है? – Rob

0

आप विंडोज सेवा (आसानी से) का उपयोग नहीं कर सकते, क्योंकि विंडोज सेवा में जीयूआई नहीं हो सकता है। सेवा के रूप में ऐसा करने का एकमात्र तरीका सेवा स्थापित करना होगा, और फिर एक जीयूआई ऐप बनाना होगा जो सेवा के अनुरोध को संवाद करने के लिए आईपीसी का उपयोग करता है। हालांकि, यह एक संभावित छेड़छाड़ खुल जाएगा।

यदि आप Vista पर चल रहे हैं, तो एक अच्छा विकल्प edit the manifest file होगा और व्यवस्थापक को आवश्यकता होगी।


संपादित करें:

ऐसा लगता है कि मेरा पहला सुझाव हो सकता है कि आप क्या चाहते ... ऐसा करने के लिए बुनियादी प्रक्रिया है:

  • आपके आवेदन एक खिड़कियों सेवा करें। एमएसडीएन पर walkthrough of this process है।
  • अपनी सेवा आईपीसी के किसी रूप में प्रतिक्रिया दें। आप सॉकेट, पाइप, या संचार के किसी अन्य रूप का उपयोग कर सकते हैं। सेवा किसी उपयोगकर्ता को अनवरोधित करने के अनुरोध के लिए "सुनी" होगी, फिर इसे निष्पादित करें।
  • मशीन पर सेवा स्थापित करें। यह इसे एक व्यवस्थापक के रूप में चलाएगा, और हमेशा हमेशा चालू रहेंगे।
  • क्लाइंट के रूप में कार्य करने के लिए दूसरा एप्लिकेशन बनाएं। सर्वर के साथ संवाद करने के लिए एक ही आईपीसी तकनीक का प्रयोग करें। यह क्लाइंट को सेवा में अनब्लॉक करने का अनुरोध भेजेगा।

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

+0

@ रेड: ऐसा करने के लिए तथाकथित एकमात्र तरीका वह है जो वह संभवतः (चाहे वह इसे महसूस करता है या नहीं) करना चाहता है। व्यवस्थापक निजीकरण की आवश्यकता केवल राइट-क्लिक के माध्यम से आसानी से की जा सकती है, लेकिन सामान्य उपयोगकर्ता उस मामले में एप्लिकेशन को चलाने में सक्षम नहीं होंगे। – Brian

+0

हाँ - मैं आपसे सहमत हूं, हालांकि, यह सामान्य रूप से एक बुरा विचार है ... –

+0

मुझे * कुछ निश्चित वर्षों से एक निश्चित COM पोर्ट एपीआई का उपयोग करने के लिए करना था जो केवल पावर उपयोगकर्ताओं और ऊपर काम करेगा । सुंदर नहीं है, लेकिन यह काम करता है। – crashmstr

2

आपको किसी और के रूप में कुछ करने के लिए विंडोज सेवा का उपयोग करने की आवश्यकता नहीं है। आप वास्तविक स्विच करने के लिए किसी अन्य उपयोगकर्ता के रूप में लॉगिन करने के लिए प्रतिरूपण का उपयोग कर सकते हैं। यहां एक उदाहरण दिया गया है जो मैंने पाया है कि लॉगिन करने के लिए विंडोज़ डीएल "advapi32.dll" का उपयोग करता है।

पृष्ठ के नीचे से नमूना कोड प्राप्त करें। मैं सिर्फ यहां अपना कोड कॉपी नहीं करना चाहता था। प्रतिरूपण के साथ

http://csharptuning.blogspot.com/2007/06/impersonation-in-c.html

एक Cavet कि हालांकि कंप्यूटर प्रतिरूपण कर उपयोगकर्ता है कि आपके नाम से कार्य के रूप में एक ही डोमेन पर होने की जरूरत है है।

0

मेरे पास इंट्रानेट साइट पर एक बहुत ही समान विजेट है, इसलिए अलग-अलग समय क्षेत्रों में स्थित आईटी विभाग के सदस्य पासवर्ड रीसेट को संभाल सकते हैं जो पश्चिम तट पर डोमेन व्यवस्थापक उपलब्ध नहीं होने पर खाता अनलॉक भी करता है। यह एक बहुत सरल कार्य है और यहाँ मैं यह कैसे किया के अलावा एक है ...

 using System.DirectoryServices; 

     // Impersonate the Admin to Reset the Password/Unlock Account // 
     // Change variables below. 
     ImpersonateUser iu = new ImpersonateUser(); 
     if (iu.impersonateValidUser("AdminUserName", "DomainName", "AdminPassword")) 
     { 
      resetPassword("AdminUserName", "AdminPassword", UserToReset, "NewPassword"); 
      iu.undoImpersonation(); 
     } 

     // Perform the Reset/Unlock // 
     public void resetPassword(string username, string password, string acct, string newpassword) 
     { 
      string Path = // LDAP Connection String 
      string Username = username; 
      string Password = password; 
      string Domain = "DomainName\\"; // Change to your domain name 

      DirectoryEntry de = new DirectoryEntry(Path, Domain + Username, Password, AuthenticationTypes.Secure); 

      DirectorySearcher ds = new DirectorySearcher(de); 

      ds.Filter = "(&(objectClass=user)(|(sAMAccountName=" + acct + ")))"; 

      ds.PropertiesToLoad.Add("displayName"); 
      ds.PropertiesToLoad.Add("sAMAccountName"); 
      ds.PropertiesToLoad.Add("DistinguishedName"); 
      ds.PropertiesToLoad.Add("CN"); 

      SearchResult result = ds.FindOne(); 

      string dn = result.Properties["DistinguishedName"][0].ToString(); 

      DirectoryEntry uEntry = new DirectoryEntry("LDAP://" + dn, username, password); 

      uEntry.Invoke("SetPassword", new object[] { newpassword }); 
      uEntry.Properties["LockOutTime"].Value = 0; 
      uEntry.CommitChanges(); 
      uEntry.Close(); 
     } 

मैं दृढ़ता से सहमत हैं, तो गलत इस्तेमाल है कि इस सुरक्षा के मुद्दों को जन्म दे सकता है, हम हर बदलाव लॉग इन और डोमेन को ईमेल कर दी है व्यवस्थापक (इसलिए उनके लूप में) और हम पासवर्ड उत्पन्न करते हैं। यह हमारे छोटे आईटी विभाग के लिए एक बड़ी मदद रही है, क्योंकि व्यवस्थापक को पासवर्ड रीसेट करने के लिए अब 4 बजे उठना नहीं है।

+0

यह बिल्कुल ठीक है कि मैंने एक प्रोजेक्ट बनाया है जो एक प्लांट मैनेजर मशीन पर स्थापित किया जाएगा, लेकिन वह एक सामान्य उपयोगकर्ता है और हम वही काम करते हैं जो मैंने अपने कार्यक्रम में तिथियां भी जोड़ दी हैं, इसलिए मुझे बस इतना करना है मेरे आवेदन को निर्देशिका में प्रकाशित करें और जब पौधे लीड मेरे एप्लिकेशन को खोलता है तो यह अपडेट की खोज करता है, फिर यह संग्रहीत व्यवस्थापक क्रेडिट को बदलता है। –

+0

मुझे आपके उदाहरण का उपयोग करने की कोशिश करते समय यह त्रुटि मिल रही है और मैंने सही संदर्भ जोड़े हैं ... त्रुटि प्रकार या नामस्थान नाम 'ImpersonateUser' नहीं मिला (क्या आप एक निर्देश या एक असेंबली संदर्भ का उपयोग कर रहे हैं ?) \t मैं डॉटनेट 3.5 का उपयोग कर रहा हूं? –

+0

कुछ चीजें ... 1।मुझे पूरा यकीन है कि प्रतिरूपण (एएसपीएनईटी या नेटवर्क सर्विसेज अकाउंट) शुरू करने वाले उपयोगकर्ता को "ऑपरेटिंग सिस्टम के हिस्से के रूप में कार्य" विशेषाधिकार सेट की आवश्यकता होती है। यह थोड़ी देर हो गया है, इसलिए इसे दोबारा जांचें ... 2. मुझे आपको यह कहना चाहिए था कि उपरोक्त मेरे प्रतिरूपित उपयोगकर्ता संदर्भ दूसरे वर्ग का हिस्सा हैं जहां मैं विसर्जन प्रक्रिया को लपेटता हूं ... पुन: उपयोग के लिए ... इस कोड प्रोजेक्ट को देखें कुछ इसी तरह का आलेख: http://www.codeproject.com/KB/cs/zetaimpersonator.aspx यदि आप इसे समझ नहीं पाते हैं, तो मैं सोमवार को पूर्ण कार्य स्रोत पोस्ट कर सकता हूं ... शुभकामनाएं! – Zachary

0

यह कोड आपको एक अन्य निष्पादन योग्य कॉल करने और चलाने के लिए अनुमति देगा।

try 
{ 
    path = path_to_your_executable; 

    ProcessStartInfo myProcess = new ProcessStartInfo(path); 
    myProcess.Domain = domain; 
    myProcess.UserName = username; 
    myProcess.Password = password; 
    myProcess.UseShellExecute = false; 

    Process.Start(myProcess); 
} 
catch (Exception myException) 
{ 
    // error handling 
} 

बिल्कुल वही नहीं जो आप खोज रहे हैं लेकिन यह एक संभावित समाधान है।

+0

यह तब तक चाल चल सकता है जब तक यह मेरे एप्लिकेशन को प्रमाणित करेगा और उपयोगकर्ता को अनलॉक करने के लिए व्यवस्थापक अधिकार देता है जो सभी maters। मुझे इसे बेहतर तरीके से रखना चाहिए। सबसे पहले आपको हर किसी के लिए धन्यवाद! मैंने इसे केवल एक विशिष्ट ओयू खोजने के लिए सीमित कर दिया है और उसमें सामान्य खाता है कि 10 लोगों को पौधे के चारों ओर 5 कंसोल में लॉग इन करने के लिए उपयोग किया जाता है, जिसे वे कभी-कभी खराब कर देते हैं और यह उस सामान्य खाते को लॉक करता है, इसलिए सुरक्षा वास्तव में चिंतित नहीं है मेरे पास सबसे अधिक आधार शामिल हैं और मेरे ऐप में संग्रहीत खाता की निगरानी बहुत करीब की जाएगी और क्रेडिट बहुत बदल गए हैं। –

+0

lol बस उन 3 बजे से बचने की कोशिश कर रहा है इस सरल कार्य के लिए कॉल –

2

यहाँ वर्ग मैं एक ASP.NET 2.0 वेबसाइट पर प्रतिरूपण प्रदर्शन करने के लिए उपयोग करते हैं, विंडोज़ 2000

पर चल रहा है उदाहरण उपयोग:

if (iu.impersonateValidUser("AdminUserName", "DomainName", "AdminPassword")) 
{    
    // Do Something Under Other Users Security Context 
    iu.undoImpersonation(); 
} 

यह है कि ... नीचे पूरा वर्ग।

using System; 
using System.Runtime.InteropServices; 
using System.Security.Principal; 


public class ImpersonateUser 
{ 
    public const int LOGON32_LOGON_INTERACTIVE = 2; 
    public const int LOGON32_PROVIDER_DEFAULT = 0; 

    WindowsImpersonationContext impersonationContext; 

    [DllImport("advapi32.dll")] 
    public static extern int LogonUserA(String lpszUserName, 
     String lpszDomain, 
     String lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     ref IntPtr phToken); 
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern int DuplicateToken(IntPtr hToken, 
     int impersonationLevel, 
     ref IntPtr hNewToken); 

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern bool RevertToSelf(); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    public static extern bool CloseHandle(IntPtr handle); 

    public bool impersonateValidUser(String userName, String domain, String password) 
    { 
     WindowsIdentity tempWindowsIdentity; 
     IntPtr token = IntPtr.Zero; 
     IntPtr tokenDuplicate = IntPtr.Zero; 

     if (RevertToSelf()) 
     { 
      if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, 
       LOGON32_PROVIDER_DEFAULT, ref token) != 0) 
      { 
       if (DuplicateToken(token, 2, ref tokenDuplicate) != 0) 
       { 
        tempWindowsIdentity = new WindowsIdentity(tokenDuplicate); 
        impersonationContext = tempWindowsIdentity.Impersonate(); 
        if (impersonationContext != null) 
        { 
         CloseHandle(token); 
         CloseHandle(tokenDuplicate); 
         return true; 
        } 
       } 
      } 
     } 
     if (token != IntPtr.Zero) 
      CloseHandle(token); 
     if (tokenDuplicate != IntPtr.Zero) 
      CloseHandle(tokenDuplicate); 
     return false; 
    } 

    public void undoImpersonation() 
    { 
     impersonationContext.Undo(); 
    } 
} 
+0

बहुत बढ़िया धन्यवाद! –

+0

किसी कारण से मेरा प्रोग्राम केवल उस उपयोगकर्ता को अनलॉक करेगा जिसे मैंने हाल ही में परीक्षण के लिए बनाया है। उपयोगकर्ता वहां मौजूद हैं यदि मैं उनमें से एक को लॉक करता हूं और फिर अपना ऐप चलाता हूं तो यह उन्हें combobox में सूचीबद्ध करेगा और मैं उन पर क्लिक करता हूं और फिर अनलॉक बटन पर क्लिक करता हूं जो इसे डीबग करने के बाद काम नहीं करता है और इसे कोड के माध्यम से देखता है I मुझे लगता है कि मैंने जो खाता बनाया है, वह पाया जाता है और परिणाम को वापस भेजता है लेकिन अन्य उपयोगकर्ता नतीजे बताते हैं कि समस्या क्या हो सकती है? आपके समय के लिए धन्यवाद –

+0

क्या खातों का स्थान समान है, आपको सही स्थान पर इंगित करने के लिए अपने एलडीएपी पथ को बदलने की आवश्यकता हो सकती है। डिफ़ॉल्ट रूप से, विंडोज़ में उपयोगकर्ता "उपयोगकर्ता" नामक सीएन में बनाए जाते हैं। हम आम तौर पर हमारे उपयोगकर्ताओं को "भौगोलिक स्थान" नामक ओयू में स्टोर करते हैं। यदि पथ विवरण सही स्थान पर इंगित नहीं करता है, तो उपयोगकर्ता खाते नहीं मिलेगा। – Zachary

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