在Winform程序中設置管理員權限及為用戶組添加寫入權限

在我們一些Winform程序中,往往需要具有一些特殊的權限才能操作系統文件,我們可以設置運行程序具有管理員權限或者設置運行程序的目錄具有寫入的權限,如果是在操作系統里面,我們可以設置運行程序以管理員身份運行,或者設置Users用戶組在運行目錄中具有寫入權限都可以解決問題,不過如果我們想通過C#代碼進行自動的處理,那么應該如何實現呢?

1、系統設置管理員權限或者目錄寫入權限

如果我們需要讓程序以管理員身份運行,那么可以通過設置快捷方式的屬性或者應用程序的屬性為【以管理員身份運行此程序】即可實現,如下所示。

如果我們需要一些寫入文件的權限,如我們程序可能需要操作SQLite文件數據庫,那么也可以通過設置Users用戶組在運行目錄中具有寫入權限都可以解決問題,否則可能會出現【?attempt to write a readonly database】的錯誤。

我們設置步驟如下所示:找到SQLite數據庫所在的文件夾,單擊右鍵,屬性->安全,為Users用戶組添加寫入權限。

?

2、使用C#代碼實現

上面的步驟可以解決我們實際碰到的權限訪問問題,那么我們如果使用C#代碼,應該如何實現這些操作呢?

對于第一個以管理員身份運行程序的處理操作,我們是可以通過程序修改配置的方式實現,這樣可以避免一些Winform程序運行時刻的權限問題:

1)在通過winform程序執行cmd命令時,某些情況下如果不是以管理員身份運行,則會提示命令無效。

2)或者通過winform程序執行Windows Service 服務時,也需要以管理員身份才能調用Service服務。

3)處理其他需要管理員身份的相關操作。

我們如果是編譯Winform程序,只需要幾步就可以在讓程序在運行的時候獲得管理員身份,如下所示在我們Winform的UI項目【屬性】【安全性】里面,勾選ClickOne的設置。

然后我們就可以看到在UI項目【Properties】目錄里面,生成了一個app.manifest文件。

這個app.manifest文件是自動生成的,我們修改其中的一項設置,然后取消上面勾選ClickOne的設置就可以了。

把其中app.manifest文件的內容:

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

改為:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

即可,這樣取消上面勾選ClickOne的設置,然后重新編譯整個程序即可。

在程序運行的時候,會提示“用戶賬戶控制”來獲取管理員權限運行,點擊“是”則獲取了管理員權限。

?

對于需要為指定目錄設置用戶組權限,那么也是可以通過C#代碼進行處理的。

一般情況下,我們可以在程序安裝或者啟動的時候,對目錄進行用戶組權限的處理,這樣程序運行起來就自然具有對應目錄的讀寫權限了。

如我們在程序啟動的時候處理,那么我們可以在Main函數的里面進行設置。

        /// <summary>/// 應用程序的主入口點。/// </summary>
        [STAThread]private static void Main(){}

為了方便處理,我們添加一個公共的函數,用來處理用戶組的目錄權限訪問操作,C#代碼如下所示。

        /// <summary>/// 為指定用戶組,授權目錄指定完全訪問權限/// </summary>/// <param name="user">用戶組,如Users</param>/// <param name="folder">實際的目錄</param>/// <returns></returns>private static bool SetAccess(string user, string folder){//定義為完全控制的權限const FileSystemRights Rights = FileSystemRights.FullControl;//添加訪問規則到實際目錄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;//為繼承關系添加訪問規則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函數里面進行調用就可以了。

        /// <summary>/// 應用程序的主入口點。/// </summary>
        [STAThread]private static void Main(){//為用戶組指定對應目錄的完全訪問權限
           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();}

這樣在程序運行后,我們就可以看到對應目錄具有完全的讀寫操作權限了,這樣對于一些如讀寫SQLite出錯的問題,也就迎刃而解了。

以上就是我對于兩種不同權限訪問的處理經驗總結,希望給在Winform開發中的同行參考,感謝耐心的閱讀和支持。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284270.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284270.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284270.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫性能系列之索引(上)

前言上一次&#xff0c;我們從優化子查詢的角度&#xff0c;講解了一些簡單的數據庫性能優化方面的知識。通過優化子查詢的順序&#xff0c;包括合理使用IN和EXISTS&#xff0c;可以起到部分查詢的效率提升。但對于其他大多數場景&#xff0c;如單表記錄很大&#xff0c;或多表…

題目1023:EXCEL排序---------Case后面的是count,不是C

#include<stdio.h> #include<algorithm> #include<cstring> using namespace std;struct student {char num[10];char name[10];int grade; }s[100002]; int cmp1(student s1,student s2)//case 1 按照學號遞增 {return strcmp(s1.num,s2.num)<0; } int…

【ArcGIS微課1000例】0052:創建地理數據庫注記(標準注記、要素關聯注記、尺寸注記)

本文講述創建地理數據庫注記(標準注記、要素關聯注記、尺寸注記)的方法。 文章目錄 一、創建標準注記二、創建與要素關聯的注記三、創建尺寸注記一、創建標準注記 標準注記不與地理數據庫中的要素關聯。標準注記的一個例子是,地圖上標記某山脈的文字,沒有特定的要索代表該…

Lambda表達式超詳解

目錄 背景 Lambda表達式的用法 函數式接口 Lambda表達式的基本使用 語法精簡 變量捕獲 匿名內部類 匿名內部類中的變量捕獲 Lambda的變量捕獲 Lambda表達式在類集中的使用 Collection接口 List接口 Map接口 總結 背景 Lambda表達式是Java SE 8中的一個重要的新特性.…

用十條命令在一分鐘內檢查Linux服務器性能

這種干活必須要和大家分享的啊。 如果你的Linux服務器突然負載暴增&#xff0c;告警短信快發爆你的手機&#xff0c;如何在最短時間內找出Linux性能問題所在&#xff1f;來看Netflix性能工程團隊的這篇博文&#xff0c;看它們通過十條命令在一分鐘內對機器性能問題進行診斷。 概…

[javaEE] JDBC快速入門

JDBC&#xff1a;Java Data Base Connectivity java數據庫連接 1.組成JDBC的兩個包&#xff1a;主要是接口 java.sql javax.sql 2.相應JDBC的數據庫實現 在tomcat的目錄下面添加mysql-connector-java-5.0.8-bin.jar這個數據庫驅動包 package com.tsh.web;import java.io.IOExce…

【ArcGIS微課1000例】0053:注記(水平、沿直線、跟隨要素、牽引線、彎曲注記)的創建與編輯

文章目錄 一、創建注記1.創建注記要素類2. 水平注記3. 沿直線4. 隨沿要素5. 沿引線6. 彎曲二、修改注記1. 復制粘貼2. 移動注記3. 旋轉注記4. 刪除注記5. 堆疊和取消堆疊6. 向注記添加引線7. 將注記轉換為多部分8. 編輯關聯要素的注記一、創建注記 注記的創建方法參考:【ArcG…

定制.NET 6.0的依賴注入

本章是《定制ASP NET 6.0框架系列文章》的第三篇。在本章&#xff0c;我們將學習ASP.NET Core的依賴項注入&#xff08;DI&#xff09;以及如何自定義它。我們將討論以下主題&#xff1a;使用不同的DI容器探索ConfigureServices方法使用其他的ServiceProviderScrutor簡介技術準…

50 個 Redis 必備知識:基礎知識,架構、調優和監控知識及難點解決

本文包括&#xff1a;30 個 Redis 基礎知識&#xff1b;10個 Redis 架構和運維必懂的知識&#xff1b;Redis 調優、監控知識和10個具體應用難點。 本篇文檔已整理成pdf文檔&#xff0c;需要的同學文末自取 30 個 Redis 基礎知識 1、Redis支持哪幾種數據類型&#xff1f; Str…

【ArcGIS微課1000例】0043:ArcGIS繪制國界線的3種方法

本文講解ArcGIS繪制國界線的3種方法。 文章目錄 1. 直接修改國界線符號2. 緩沖區工具3. 制圖表達1. 直接修改國界線符號 直接修改國界線/省界線的符號。點擊“線要素”出現符號選擇器,點擊【編輯符號】按鈕,編輯成下面右圖的形式。缺點:只能在邊界一側出現緩沖樣式,如下面…

javascript雜記

菜鳥教程   http://www.runoob.com/js/js-tutorial.html 響應鍵盤事件  https://www.cnblogs.com/shihaiming/p/6210655.html 窗口變化  http://www.jb51.net/article/124581.htm div定位1  http://www.divcss5.com/shili/s587.shtml   div定位2  https://www.cnbl…

沒有暑假的Ada 要好好努力咯 C#繼續

嗷嗷嗷啊啊啊啊啊轉載于:https://www.cnblogs.com/AdaLoong/p/5645720.html

C# 獲取系統已安裝的.NET版本

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;唐宋元明清原文地址&#xff1a; https://www.cnblogs.com/kybs0/p/16478587.htmlC# 獲取系統已安裝的.NET版本獲取系統已安裝的.NET版本&#xff0c;來確定當前應用可運行的環境。獲取系…

.NET 6 Minimal API 的經驗分享

Minimal API 是 .NET 6 提供的最新功能 &#xff0c; 對比傳統的 ASP.NET Core Web API 方式更加直接 , 你可以用幾行代碼編寫好 REST API 。 沒有了祖傳的 Startup.cs 和 Controller &#xff0c;通過簡單的代碼就可以完成 API 的開發。在第二階段的 .NET 挑戰賽中就以 .NET 6…

JavaWeb之Filter過濾器

原本計劃這一篇來總結JSP&#xff0c;由于JSP的內容比較多&#xff0c;又想著晚上跑跑步減減肥&#xff0c;所以今天先介紹Filter以及它的使用舉例&#xff0c;這樣的話還有些時間可以鍛煉鍛煉。言歸正傳&#xff0c;過濾器從字面理解她的話有攔網、過濾的功能&#xff0c;可以…

【ArcGIS微課1000例】0054:尺寸注記的創建與編輯

尺寸注記要素是一種特殊類型的文本,用于顯示地圖上的長度或距離,可以創建各種形狀的尺寸注記要素,如對齊、簡單對齊、水平線狀、垂直線狀和旋轉線狀等。 文章目錄 一、創建尺寸注記1. 直接創建尺寸注記要素2. 通過已有尺寸注記要素創建二、編輯尺寸注記1. 刪除尺寸注記要素2…

利用python實現批量查詢ip地址歸屬地址

今天需要查詢nginx訪問的客戶端ip是否和調度一樣&#xff01;先是用shell把文件中的ip截取出來&#xff1a; python腳本如下&#xff1a;&#xff08;哈哈&#xff0c;新手寫的很草率&#xff09;#!/usr/bin/env#-- coding: utf-8 - import jsonimport urllibimport socketimpo…

Cobbler部署之FAQ處理

Cobbler報錯處理 通過cobbler check檢查出現的報錯 紅色標注為報錯關鍵信息 9.1 報錯一 # cobbler check httpd does not appear to be running and proxying cobbler, or SELinux is in the way. Original traceback: Traceback (most recent call last): File "/usr…

基于.NetCore開發博客項目 StarBlog - (16) 一些新功能 (監控/統計/配置/初始化)

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…