在Winform程序中设置管理员权限及为用户组添加写入权限
在我們一些Winform程序中,往往需要具有一些特殊的權(quán)限才能操作系統(tǒng)文件,我們可以設(shè)置運(yùn)行程序具有管理員權(quán)限或者設(shè)置運(yùn)行程序的目錄具有寫(xiě)入的權(quán)限,如果是在操作系統(tǒng)里面,我們可以設(shè)置運(yùn)行程序以管理員身份運(yùn)行,或者設(shè)置Users用戶組在運(yùn)行目錄中具有寫(xiě)入權(quán)限都可以解決問(wèn)題,不過(guò)如果我們想通過(guò)C#代碼進(jìn)行自動(dòng)的處理,那么應(yīng)該如何實(shí)現(xiàn)呢?
1、系統(tǒng)設(shè)置管理員權(quán)限或者目錄寫(xiě)入權(quán)限
如果我們需要讓程序以管理員身份運(yùn)行,那么可以通過(guò)設(shè)置快捷方式的屬性或者應(yīng)用程序的屬性為【以管理員身份運(yùn)行此程序】即可實(shí)現(xiàn),如下所示。
如果我們需要一些寫(xiě)入文件的權(quán)限,如我們程序可能需要操作SQLite文件數(shù)據(jù)庫(kù),那么也可以通過(guò)設(shè)置Users用戶組在運(yùn)行目錄中具有寫(xiě)入權(quán)限都可以解決問(wèn)題,否則可能會(huì)出現(xiàn)【?attempt to write a readonly database】的錯(cuò)誤。
我們?cè)O(shè)置步驟如下所示:找到SQLite數(shù)據(jù)庫(kù)所在的文件夾,單擊右鍵,屬性->安全,為Users用戶組添加寫(xiě)入權(quán)限。
?
2、使用C#代碼實(shí)現(xiàn)
上面的步驟可以解決我們實(shí)際碰到的權(quán)限訪問(wèn)問(wèn)題,那么我們?nèi)绻褂肅#代碼,應(yīng)該如何實(shí)現(xiàn)這些操作呢?
對(duì)于第一個(gè)以管理員身份運(yùn)行程序的處理操作,我們是可以通過(guò)程序修改配置的方式實(shí)現(xiàn),這樣可以避免一些Winform程序運(yùn)行時(shí)刻的權(quán)限問(wèn)題:
1)在通過(guò)winform程序執(zhí)行cmd命令時(shí),某些情況下如果不是以管理員身份運(yùn)行,則會(huì)提示命令無(wú)效。
2)或者通過(guò)winform程序執(zhí)行Windows Service 服務(wù)時(shí),也需要以管理員身份才能調(diào)用Service服務(wù)。
3)處理其他需要管理員身份的相關(guān)操作。
我們?nèi)绻蔷幾gWinform程序,只需要幾步就可以在讓程序在運(yùn)行的時(shí)候獲得管理員身份,如下所示在我們Winform的UI項(xiàng)目【屬性】【安全性】里面,勾選ClickOne的設(shè)置。
然后我們就可以看到在UI項(xiàng)目【Properties】目錄里面,生成了一個(gè)app.manifest文件。
這個(gè)app.manifest文件是自動(dòng)生成的,我們修改其中的一項(xiàng)設(shè)置,然后取消上面勾選ClickOne的設(shè)置就可以了。
把其中app.manifest文件的內(nèi)容:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
改為:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
即可,這樣取消上面勾選ClickOne的設(shè)置,然后重新編譯整個(gè)程序即可。
在程序運(yùn)行的時(shí)候,會(huì)提示“用戶賬戶控制”來(lái)獲取管理員權(quán)限運(yùn)行,點(diǎn)擊“是”則獲取了管理員權(quán)限。
?
對(duì)于需要為指定目錄設(shè)置用戶組權(quán)限,那么也是可以通過(guò)C#代碼進(jìn)行處理的。
一般情況下,我們可以在程序安裝或者啟動(dòng)的時(shí)候,對(duì)目錄進(jìn)行用戶組權(quán)限的處理,這樣程序運(yùn)行起來(lái)就自然具有對(duì)應(yīng)目錄的讀寫(xiě)權(quán)限了。
如我們?cè)诔绦騿?dòng)的時(shí)候處理,那么我們可以在Main函數(shù)的里面進(jìn)行設(shè)置。
/// <summary>/// 應(yīng)用程序的主入口點(diǎn)。/// </summary> [STAThread]private static void Main(){}為了方便處理,我們添加一個(gè)公共的函數(shù),用來(lái)處理用戶組的目錄權(quán)限訪問(wèn)操作,C#代碼如下所示。
/// <summary>/// 為指定用戶組,授權(quán)目錄指定完全訪問(wèn)權(quán)限/// </summary>/// <param name="user">用戶組,如Users</param>/// <param name="folder">實(shí)際的目錄</param>/// <returns></returns>private static bool SetAccess(string user, string folder){//定義為完全控制的權(quán)限const FileSystemRights Rights = FileSystemRights.FullControl;//添加訪問(wèn)規(guī)則到實(shí)際目錄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;//總是允許再目錄上進(jìn)行對(duì)象繼承const InheritanceFlags iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;//為繼承關(guān)系添加訪問(wè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;}然后我們?cè)贛ain函數(shù)里面進(jìn)行調(diào)用就可以了。
/// <summary>/// 應(yīng)用程序的主入口點(diǎn)。/// </summary> [STAThread]private static void Main(){//為用戶組指定對(duì)應(yīng)目錄的完全訪問(wèn)權(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ùn)行后,我們就可以看到對(duì)應(yīng)目錄具有完全的讀寫(xiě)操作權(quán)限了,這樣對(duì)于一些如讀寫(xiě)SQLite出錯(cuò)的問(wèn)題,也就迎刃而解了。
以上就是我對(duì)于兩種不同權(quán)限訪問(wèn)的處理經(jīng)驗(yàn)總結(jié),希望給在Winform開(kāi)發(fā)中的同行參考,感謝耐心的閱讀和支持。
?
總結(jié)
以上是生活随笔為你收集整理的在Winform程序中设置管理员权限及为用户组添加写入权限的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 想尽快进入游戏开发行业的必经之路!
- 下一篇: Ubuntu 12.04 LTS安装VM