在Winform程序中设置管理员权限及为用户组添加写入权限
在我們一些Winform程序中,往往需要具有一些特殊的權(quán)限才能操作系統(tǒng)文件,我們可以設(shè)置運行程序具有管理員權(quán)限或者設(shè)置運行程序的目錄具有寫入的權(quán)限,如果是在操作系統(tǒng)里面,我們可以設(shè)置運行程序以管理員身份運行,或者設(shè)置Users用戶組在運行目錄中具有寫入權(quán)限都可以解決問題,不過如果我們想通過C#代碼進行自動的處理,那么應(yīng)該如何實現(xiàn)呢?
1、系統(tǒng)設(shè)置管理員權(quán)限或者目錄寫入權(quán)限
如果我們需要讓程序以管理員身份運行,那么可以通過設(shè)置快捷方式的屬性或者應(yīng)用程序的屬性為【以管理員身份運行此程序】即可實現(xiàn),如下所示。
如果我們需要一些寫入文件的權(quán)限,如我們程序可能需要操作SQLite文件數(shù)據(jù)庫,那么也可以通過設(shè)置Users用戶組在運行目錄中具有寫入權(quán)限都可以解決問題,否則可能會出現(xiàn)【?attempt to write a readonly database】的錯誤。
我們設(shè)置步驟如下所示:找到SQLite數(shù)據(jù)庫所在的文件夾,單擊右鍵,屬性->安全,為Users用戶組添加寫入權(quán)限。
?
2、使用C#代碼實現(xiàn)
上面的步驟可以解決我們實際碰到的權(quán)限訪問問題,那么我們?nèi)绻褂肅#代碼,應(yīng)該如何實現(xiàn)這些操作呢?
對于第一個以管理員身份運行程序的處理操作,我們是可以通過程序修改配置的方式實現(xiàn),這樣可以避免一些Winform程序運行時刻的權(quán)限問題:
1)在通過winform程序執(zhí)行cmd命令時,某些情況下如果不是以管理員身份運行,則會提示命令無效。
2)或者通過winform程序執(zhí)行Windows Service 服務(wù)時,也需要以管理員身份才能調(diào)用Service服務(wù)。
3)處理其他需要管理員身份的相關(guān)操作。
我們?nèi)绻蔷幾gWinform程序,只需要幾步就可以在讓程序在運行的時候獲得管理員身份,如下所示在我們Winform的UI項目【屬性】【安全性】里面,勾選ClickOne的設(shè)置。
然后我們就可以看到在UI項目【Properties】目錄里面,生成了一個app.manifest文件。
這個app.manifest文件是自動生成的,我們修改其中的一項設(shè)置,然后取消上面勾選ClickOne的設(shè)置就可以了。
把其中app.manifest文件的內(nèi)容:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
改為:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
即可,這樣取消上面勾選ClickOne的設(shè)置,然后重新編譯整個程序即可。
在程序運行的時候,會提示“用戶賬戶控制”來獲取管理員權(quán)限運行,點擊“是”則獲取了管理員權(quán)限。
?
對于需要為指定目錄設(shè)置用戶組權(quán)限,那么也是可以通過C#代碼進行處理的。
一般情況下,我們可以在程序安裝或者啟動的時候,對目錄進行用戶組權(quán)限的處理,這樣程序運行起來就自然具有對應(yīng)目錄的讀寫權(quán)限了。
如我們在程序啟動的時候處理,那么我們可以在Main函數(shù)的里面進行設(shè)置。
/// <summary>/// 應(yīng)用程序的主入口點。/// </summary> [STAThread]private static void Main(){}為了方便處理,我們添加一個公共的函數(shù),用來處理用戶組的目錄權(quán)限訪問操作,C#代碼如下所示。
/// <summary>/// 為指定用戶組,授權(quán)目錄指定完全訪問權(quán)限/// </summary>/// <param name="user">用戶組,如Users</param>/// <param name="folder">實際的目錄</param>/// <returns></returns>private static bool SetAccess(string user, string folder){//定義為完全控制的權(quán)限const FileSystemRights Rights = FileSystemRights.FullControl;//添加訪問規(guī)則到實際目錄var AccessRule = new FileSystemAccessRule(user, Rights,InheritanceFlags.None,PropagationFlags.NoPropagateInherit,AccessControlType.Allow);var Info = new DirectoryInfo(folder);var Security = Info.GetAccessControl(AccessControlSections.Access);bool Result;Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result);if (!Result) return false;//總是允許再目錄上進行對象繼承const InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;//為繼承關(guān)系添加訪問規(guī)則AccessRule = new FileSystemAccessRule(user, Rights,iFlags,PropagationFlags.InheritOnly,AccessControlType.Allow);Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result);if (!Result) return false;Info.SetAccessControl(Security);return true;}然后我們在Main函數(shù)里面進行調(diào)用就可以了。
/// <summary>/// 應(yīng)用程序的主入口點。/// </summary> [STAThread]private static void Main(){//為用戶組指定對應(yīng)目錄的完全訪問權(quán)限 SetAccess("Users", Application.StartupPath);//界面漢化System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-Hans");DevExpress.UserSkins.BonusSkins.Register();DevExpress.Skins.SkinManager.EnableFormSkins();Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);//登錄界面Login dlg = new Login();dlg.StartPosition = FormStartPosition.CenterScreen;if (DialogResult.OK == dlg.ShowDialog()){if (dlg.bLogin){SplashScreen.Splasher.Show(typeof(SplashScreen.frmSplash));gc.MainDialog = new MainForm();gc.MainDialog.StartPosition = FormStartPosition.CenterScreen;Application.Run(gc.MainDialog);}}dlg.Dispose();}這樣在程序運行后,我們就可以看到對應(yīng)目錄具有完全的讀寫操作權(quán)限了,這樣對于一些如讀寫SQLite出錯的問題,也就迎刃而解了。
以上就是我對于兩種不同權(quán)限訪問的處理經(jīng)驗總結(jié),希望給在Winform開發(fā)中的同行參考,感謝耐心的閱讀和支持。
?
總結(jié)
以上是生活随笔為你收集整理的在Winform程序中设置管理员权限及为用户组添加写入权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想尽快进入游戏开发行业的必经之路!
- 下一篇: c语言开根号不用math,c语言sqrt