2015-01-19 2 views
5

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

मैंने यहां कुछ और शेल फ़ंक्शन, SHObjectProperties का उल्लेख किया है, लेकिन इसका उपयोग करने के तरीके पर कुछ भी स्पष्ट नहीं है। किसी भी सहायता की सराहना की जाएगी।

+0

http://www.codeguru.com/csharp/csharp/cs_webservices/security/article.php/c14315/The-Basics-of-Manipulating-File-Access-Control-Lists-with-C। एचटीएम – Plutonix

उत्तर

9

आप Windows फाइल अनुमति ShellExecuteEx का उपयोग कर संवाद प्रदर्शित कर सकते हैं ("गुण" क्रिया और "सुरक्षा" पैरामीटर का उपयोग)।

यह आपके प्रक्रिया के भीतर निम्नलिखित की तरह एक संवाद प्रदर्शित करेगा, और फ़ाइल अनुमति देखने और संपादित करने पूरी तरह कार्यात्मक बस के रूप में यदि आप Windows एक्सप्लोरर खोल के माध्यम से इस संवाद मिला था हो जाएगा:

enter image description here

यहां विंडोज फॉर्म के साथ एक उदाहरण दिया गया है जहां एक फ़ाइल का चयन किया गया है और उस फ़ाइल के सुरक्षा गुण तब प्रदर्शित होते हैं। मैंने से ShellExecuteEx के लिए पी/आमंत्रण कोड का उपयोग किया है।

using System; 
using System.Runtime.InteropServices; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace FileSecurityProperties 
{ 
    public partial class FileSelectorForm : Form 
    { 
     private static bool ShowFileSecurityProperties(string Filename, IntPtr parentHandle) 
     { 
      SHELLEXECUTEINFO info = new SHELLEXECUTEINFO(); 
      info.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(info); 
      info.lpVerb = "properties"; 
      info.lpFile = Filename; 
      info.nShow = SW_SHOW; 
      info.fMask = SEE_MASK_INVOKEIDLIST; 
      info.hwnd = parentHandle; 
      info.lpParameters = "Security"; // Opens the file properties on the Security tab 
      return ShellExecuteEx(ref info); 
     } 

     private void fileSelectButton_Click(object sender, EventArgs e) 
     { 
      if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       ShowFileSecurityProperties(
        openFileDialog.FileName, 
        this.Handle); // Pass parent window handle for properties dialog 
      } 
     } 

     #region P/Invoke code for ShellExecuteEx from https://stackoverflow.com/a/1936957/4486839 
     [DllImport("shell32.dll", CharSet = CharSet.Auto)] 
     static extern bool ShellExecuteEx(ref SHELLEXECUTEINFO lpExecInfo); 

     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
     public struct SHELLEXECUTEINFO 
     { 
      public int cbSize; 
      public uint fMask; 
      public IntPtr hwnd; 
      [MarshalAs(UnmanagedType.LPTStr)] 
      public string lpVerb; 
      [MarshalAs(UnmanagedType.LPTStr)] 
      public string lpFile; 
      [MarshalAs(UnmanagedType.LPTStr)] 
      public string lpParameters; 
      [MarshalAs(UnmanagedType.LPTStr)] 
      public string lpDirectory; 
      public int nShow; 
      public IntPtr hInstApp; 
      public IntPtr lpIDList; 
      [MarshalAs(UnmanagedType.LPTStr)] 
      public string lpClass; 
      public IntPtr hkeyClass; 
      public uint dwHotKey; 
      public IntPtr hIcon; 
      public IntPtr hProcess; 
     } 

     private const int SW_SHOW = 5; 
     private const uint SEE_MASK_INVOKEIDLIST = 12; 
     #endregion 

     #region Irrelevant Windows forms code 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 
     private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) 
     { 
      if (disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

     #region Windows Form Designer generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InitializeComponent() 
     { 
      this.openFileDialog = new System.Windows.Forms.OpenFileDialog(); 
      this.fileSelectButton = new System.Windows.Forms.Button(); 
      this.SuspendLayout(); 
      // 
      // openFileDialog1 
      // 
      this.openFileDialog.FileName = ""; 
      // 
      // fileSelectButton 
      // 
      this.fileSelectButton.Location = new System.Drawing.Point(52, 49); 
      this.fileSelectButton.Name = "fileSelectButton"; 
      this.fileSelectButton.Size = new System.Drawing.Size(131, 37); 
      this.fileSelectButton.TabIndex = 0; 
      this.fileSelectButton.Text = "Select file ..."; 
      this.fileSelectButton.UseVisualStyleBackColor = true; 
      this.fileSelectButton.Click += new System.EventHandler(this.fileSelectButton_Click); 
      // 
      // FileSelectorForm 
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
      this.ClientSize = new System.Drawing.Size(248, 162); 
      this.Controls.Add(this.fileSelectButton); 
      this.Name = "FileSelectorForm"; 
      this.Text = "File Selector"; 
      this.ResumeLayout(false); 

     } 

     #endregion 

     private System.Windows.Forms.OpenFileDialog openFileDialog; 
     private System.Windows.Forms.Button fileSelectButton; 

     public FileSelectorForm() 
     { 
      InitializeComponent(); 
     } 

     #endregion 
    } 

    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new FileSelectorForm()); 
     } 
    } 
} 

आप बल्कि सामान्य फ़ाइल गुण संवाद में एक टैब के रूप से अपने आप ही फाइल अनुमति संवाद प्राप्त करने के लिए, उम्मीद कर रहे थे, तो उस aclui.dll, उदा संभव है EditSecurity function का उपयोग करके, लेकिन यह आपको आपके लिए की जाने वाली फ़ाइल अनुमतियों को संभालने की आपकी अन्य आवश्यकता नहीं देगा, क्योंकि आपको एक इंटरफ़ेस प्रदान करना होगा जो सुरक्षा मार्गों को प्राप्त करने और सेटिंग करने पर आपको उस मार्ग पर जाने के लिए करता है, और यह बहुत कोडिंग की तरह दिखता है।

0

मेरे बुरे 'अट्रिब' को खोलता है यह कैसे होता था।

जो आप करना चाहते हैं, मेरा मानना ​​है कि "फ़ोल्डरों और फ़ाइलों पर सुरक्षा वर्णनकर्ताओं को बदलें"। कमांड लाइन उपकरण cacls है।

कृपया देखें: http://en.wikipedia.org/wiki/Cacls

+0

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

6

यहां एक उपयोगी कक्षा है जो आपको केवल सुरक्षा संपत्ति शीट (सभी चादरें खोलने वाली चादरें) नहीं देती है।

enter image description here

तुम एक सांत्वना अनुप्रयोग में इस तरह यह कॉल कर सकते हैं:

class Program 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 
     // NOTE: if the dialog looks old fashioned (for example if used in a console app), 
     // then add an app.manifest and uncomment the dependency section about Microsoft.Windows.Common-Controls 
     PermissionDialog.Show(IntPtr.Zero, @"d:\temp\killroy_was_here.png"); 
    } 
} 

या एक WinForm अनुप्रयोग

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     PermissionDialog.Show(IntPtr.Zero, @"d:\temp\killroy_was_here.png"); 
    } 
} 

और यह मुख्य वर्ग है में इस तरह। यह मूल रूप से खोल के समान चीज का उपयोग कर रहा है, लेकिन अपनी संपत्ति शीट में।

public static class PermissionDialog 
{ 
    public static bool Show(IntPtr hwndParent, string path) 
    { 
     if (path == null) 
      throw new ArgumentNullException("path"); 

     SafePidlHandle folderPidl; 
     int hr; 
     hr = SHILCreateFromPath(Path.GetDirectoryName(path), out folderPidl, IntPtr.Zero); 
     if (hr != 0) 
      throw new Win32Exception(hr); 

     SafePidlHandle filePidl; 
     hr = SHILCreateFromPath(path, out filePidl, IntPtr.Zero); 
     if (hr != 0) 
      throw new Win32Exception(hr); 

     IntPtr file = ILFindLastID(filePidl); 

     System.Runtime.InteropServices.ComTypes.IDataObject ido; 
     hr = SHCreateDataObject(folderPidl, 1, new IntPtr[] { file }, null, typeof(System.Runtime.InteropServices.ComTypes.IDataObject).GUID, out ido); 
     if (hr != 0) 
      throw new Win32Exception(hr); 

     // if you get a 'no such interface' error here, make sure the running thread is STA 
     IShellExtInit sei = (IShellExtInit)new SecPropSheetExt(); 
     sei.Initialize(IntPtr.Zero, ido, IntPtr.Zero); 

     IShellPropSheetExt spse = (IShellPropSheetExt)sei; 
     IntPtr securityPage = IntPtr.Zero; 
     spse.AddPages((p, lp) => 
     { 
      securityPage = p; 
      return true; 
     }, IntPtr.Zero); 

     PROPSHEETHEADER psh = new PROPSHEETHEADER(); 
     psh.dwSize = Marshal.SizeOf(psh); 
     psh.hwndParent = hwndParent; 
     psh.nPages = 1; 
     psh.phpage = Marshal.AllocHGlobal(IntPtr.Size); 
     Marshal.WriteIntPtr(psh.phpage, securityPage); 

     // TODO: adjust title & icon here, also check out the available flags 
     psh.pszCaption = "Permissions for '" + path + "'"; 

     IntPtr res; 
     try 
     { 
      res = PropertySheet(ref psh); 
     } 
     finally 
     { 
      Marshal.FreeHGlobal(psh.phpage); 
     } 
     return res == IntPtr.Zero; 
    } 

    private class SafePidlHandle : SafeHandle 
    { 
     public SafePidlHandle() 
      : base(IntPtr.Zero, true) 
     { 
     } 

     public override bool IsInvalid 
     { 
      get { return handle == IntPtr.Zero; } 
     } 

     protected override bool ReleaseHandle() 
     { 
      if (IsInvalid) 
       return false; 

      Marshal.FreeCoTaskMem(handle); 
      return true; 
     } 
    } 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    private struct PROPSHEETHEADER 
    { 
     public int dwSize; 
     public int dwFlags; 
     public IntPtr hwndParent; 
     public IntPtr hInstance; 
     public IntPtr hIcon; 
     public string pszCaption; 
     public int nPages; 
     public IntPtr nStartPage; 
     public IntPtr phpage; 
     public IntPtr pfnCallback; 
    } 

    [DllImport("shell32.dll")] 
    private static extern IntPtr ILFindLastID(SafePidlHandle pidl); 

    [DllImport("shell32.dll", CharSet = CharSet.Unicode)] 
    private static extern int SHILCreateFromPath(string pszPath, out SafePidlHandle ppidl, IntPtr rgflnOut); 

    [DllImport("shell32.dll")] 
    private static extern int SHCreateDataObject(SafePidlHandle pidlFolder, int cidl, IntPtr[] apidl, System.Runtime.InteropServices.ComTypes.IDataObject pdtInner, [MarshalAs(UnmanagedType.LPStruct)] Guid riid, out System.Runtime.InteropServices.ComTypes.IDataObject ppv); 

    [DllImport("comctl32.dll", CharSet = CharSet.Unicode)] 
    private static extern IntPtr PropertySheet(ref PROPSHEETHEADER lppsph); 

    private delegate bool AddPropSheetPage(IntPtr page, IntPtr lParam); 

    [ComImport] 
    [Guid("1f2e5c40-9550-11ce-99d2-00aa006e086c")] // this GUID points to the property sheet handler for permissions 
    private class SecPropSheetExt 
    { 
    } 

    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("000214E8-0000-0000-C000-000000000046")] 
    private interface IShellExtInit 
    { 
     void Initialize(IntPtr pidlFolder, System.Runtime.InteropServices.ComTypes.IDataObject pdtobj, IntPtr hkeyProgID); 
    } 

    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("000214E9-0000-0000-C000-000000000046")] 
    private interface IShellPropSheetExt 
    { 
     void AddPages([MarshalAs(UnmanagedType.FunctionPtr)] AddPropSheetPage pfnAddPage, IntPtr lParam); 
     void ReplacePage(); // not fully defined, we don't use it 
    } 
} 
संबंधित मुद्दे