2012-10-21 17 views
5

मैं एक फ़ाइल का स्वामित्व लेने और इसे सी # के माध्यम से हटाने की कोशिश कर रहा हूं। फ़ाइल iexplorer.exe है, डिफ़ॉल्ट रूप से वर्तमान मालिक - विश्वसनीय इन्स्टॉलर। विधि FileSecurity.SetOwner निर्दिष्ट स्वामित्व सेट करने लगता है, लेकिन वास्तव में प्रारंभिक स्वामी को नहीं बदलता है और कोई अपवाद नहीं फेंकता है। जाहिर है, फ़ाइल को हटाने का अगला प्रयास अपवाद फेंकता है। फ़ाइल में स्वामित्व लेने और इसे हटाने के लिए कोड में क्या बदला जाना चाहिए?फ़ाइल का स्वामित्व लें C#

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 
fileS.SetOwner(new System.Security.Principal.NTAccount(Environment.UserDomainName, Environment.UserName)); 
File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 
+2

क्या यूएसी यहाँ के साथ हो रहा है? क्या आप ऊंचे चल रहे हैं? –

+0

हां और मदद नहीं करता है। आपको विशेषाधिकार सेट करने की आवश्यकता है, फिर दी गई फ़ाइल को हटाएं। समाधान यहां है: http://msdn.microsoft.com/en-us/magazine/cc164701.aspx?code=true&level=root%2cPrivilege11 – alternative

उत्तर

4

आप स्पष्ट रूप से SeTakeOwnershipPrivilege सक्षम करना होगा:

बिना एक वस्तु का स्वामित्व लेने के लिए आवश्यक विवेकाधीन पहुँच प्रदान की जा रही है। यह विशेषाधिकार मालिक मान को को केवल उन मानों पर सेट करने की अनुमति देता है जो धारक किसी ऑब्जेक्ट के स्वामी के रूप में वैध रूप से असाइन कर सकते हैं। उपयोगकर्ता अधिकार: फ़ाइलों का स्वामित्व या अन्य ऑब्जेक्ट्स लें।

मैं आपको मार्क नोवाक द्वारा लिखे गए महान लेख को पढ़ने का सुझाव देता हूं: Manipulate Privileges in Managed Code Reliably, Securely, and Efficiently

और/या अपने sample पर एक नज़र डालें।

अद्यतन

उदाहरण उपयोग:

var fileS = File.GetAccessControl(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 

Privilege p; 
bool ownerChanged = false; 
try 
{ 
    p = new Privilege(Privilege.TakeOwnership); 
    p.Enable(); 

    fileS.SetOwner(new System.Security.Principal.NTAccount(
     Environment.UserDomainName, Environment.UserName)); 

    ownerChanged = true; 
} 
catch(PrivilegeNotHeldException e) 
{ 
    // privilege not held 
    // TODO: show an error message, write logs, etc. 
} 
finally 
{ 
    p.Revert(); 
} 

if (ownerChanged) 
    File.Delete(@"C:\Program Files (x86)\Internet Explorer\iexplore.exe"); 
+0

धन्यवाद, निकोले। किसी का कामकाजी कोड अभी भी स्वागत से अधिक है। – alternative

+0

@ वैकल्पिक मेरे उत्तर में नमूना कोड के साथ 'विशेषाधिकार' वर्ग के मार्क के कार्यान्वयन के लिंक शामिल हैं। मुझे नहीं लगता कि मुझे यहां कोड की लगभग 1k लाइनों की प्रतिलिपि बनाना चाहिए और पेस्ट करना चाहिए। हालांकि मैंने एक उदाहरण के उपयोग के साथ अपना जवाब अपडेट किया है। –

+0

आलेख लिंक टूटा हुआ है लेकिन आप इसे अभी भी इस पृष्ठ के निचले हिस्से तक स्क्रॉल करके सीएचएम फॉर्म में प्राप्त कर सकते हैं: https://msdn.microsoft.com/magazine/msdn-magazine-issues और मार्च 2005 को क्लिक करना। सही बचत के बाद उस पर क्लिक करें और गुणों में आपको अनब्लॉक करने की आवश्यकता है, अन्यथा यह खाली हो जाता है। इसके अलावा स्रोत कोड को सभी चीजों की एक .exe फ़ाइल में सीएचएम के भीतर से जोड़ा जाता है, ऐसा लगता है कि इसे किसी भी कारण से स्थापित करने की आवश्यकता है। – TripleAntigen

1
 string filepath = @"C:\Program Files (x86)\Internet Explorer\iexplore.exe"; 

     //Get Currently Applied Access Control 
     FileSecurity fileS = File.GetAccessControl(filepath); 

     //Update it, Grant Current User Full Control 
     SecurityIdentifier cu = WindowsIdentity.GetCurrent().User; 
     fileS.SetOwner(cu); 
     fileS.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.FullControl, AccessControlType.Allow)); 

     //Update the Access Control on the File 
     File.SetAccessControl(filepath, fileS); 

     //Delete the file 
     File.Delete(filepath); 

निम्नलिखित आयात

 using System.IO; 
     using System.Security.AccessControl; 
     using System.Security.Principal; 

भागो ऊंचा मोड में कोड जोड़ें।

1

Windows 8.1 में संचालित उदाहरण से वर्ग विशेषाधिकार का उपयोग करते हुए: Manipulate Privileges in Managed Code Reliably, Securely, and Efficiently

private bool TryDeleteFile(string fileName) 
    { 
     string filePath = Path.GetFullPath(fileName); 
     var fi = new FileInfo(filePath); 

     bool ownerChanged = false; 
     bool accessChanged = false; 
     bool isDelete = false; 

     FileSecurity fs = fi.GetAccessControl(); 
     Privilege p = new Privilege(Privilege.TakeOwnership); 

     try 
     { 
      p.Enable(); 
      fs.SetOwner(WindowsIdentity.GetCurrent().User); 
      File.SetAccessControl(filePath, fs); //Update the Access Control on the File 
      ownerChanged = true; 
     } 
     catch (PrivilegeNotHeldException ex) { } 
     finally { p.Revert(); } 

     try 
     { 
      fs.SetAccessRule(new FileSystemAccessRule(WindowsIdentity.GetCurrent().User, FileSystemRights.FullControl, AccessControlType.Allow)); 
      File.SetAccessControl(filePath, fs); 
      accessChanged = true; 
     } 
     catch (UnauthorizedAccessException ex) { } 

     if (ownerChanged && accessChanged) 
     { 
      try 
      { 
       fi.Delete(); 
       isDelete = true; 
      } 
      catch (Exception ex) { } 
     } 

     return isDelete; 
    } 
संबंधित मुद्दे