#p#分页标题#e# /// summary/// 应用程序的主入口点

时间:2021-10-13 06:36:32

在我们一些Winform措施中,往往需要具有一些特殊的权限才华操纵系统文件,我们可以设置运行措施具有打点员权限或者设置运行措施的目录具有写入的权限,如果是在操纵系统里面,我们可以设置运行措施以打点员身份运行,或者设置Users用户组在运行目录中具有写入权限都可以解决问题,不过如果我们想通过C#代码进行自动的措置惩罚惩罚,那么应该如何实现呢?

1、系统设置打点员权限或者目录写入权限

如果我们需要让措施以打点员身份运行,那么可以通过设置快捷方法的属性或者应用措施的属性为【以打点员身份运行此措施】即可实现,如下所示。

#p#分页标题#e# /// summary/// 应用程序的主入口点

如果我们需要一些写入文件的权限,如我们措施可能需要操纵SQLite文件数据库,那么也可以通过设置Users用户组在运行目录中具有写入权限都可以解决问题,否则可能会呈现【 attempt to write a readonly database】的错误。

#p#分页标题#e# /// summary/// 应用程序的主入口点

我们设置法式如下所示:找到SQLite数据库地址的文件夹,单击右键,属性->安适,为Users用户组添加写入权限。

#p#分页标题#e# /// summary/// 应用程序的主入口点

2、使用C#代码实现

上面的法式可以解决我们实际碰到的权限访谒问题,那么我们如果使用C#代码,应该如何实现这些操纵呢?

对付第一个以打点员身份运行措施的措置惩罚惩罚操纵,我们是可以通过措施改削配置的方法实现,这样可以制止一些Winform措施运行时刻的权限问题:

1)在通过winform措施执行cmd命令时,某些情况下如果不是以打点员身份运行,则会提示命令无效。

2)或者通过winform措施执行Windows Service 处事时,也需要以打点员身份才华挪用Service处事。

3)措置惩罚惩罚其他需要打点员身份的相关操纵。

我们如果是编译Winform措施,只需要几步就可以在让措施在运行的时候获得打点员身份,如下所示在我们Winform的UI项目【属性】【安适性】里面,,勾选ClickOne的设置。

#p#分页标题#e# /// summary/// 应用程序的主入口点

然后我们就可以看到在UI项目【Properties】目录里面,生成了一个app.manifest文件。

#p#分页标题#e# /// summary/// 应用程序的主入口点

这个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>用户组,如Users</param> /// <param>实际的目录</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函数里面进行挪用就可以了。