C# Winform 应用程序仅以管理员身份运行

Posted

技术标签:

【中文标题】C# Winform 应用程序仅以管理员身份运行【英文标题】:C# Winform Application Only Working as Run as Administrator 【发布时间】:2020-08-04 08:15:01 【问题描述】:

我正在开发一个应用程序,它是 Windows 窗体应用程序,并在 Microsoft Access 数据库 (.mdb) 中执行 CRUD 操作。

旧应用程序: 该应用程序是使用 C# 和 Microsoft .Net Framework 4.0 开发的。

以前的开发人员使用 Visual Studio 安装程序项目来创建安装文件。 默认安装路径为“C:\Program Files (x86)\MyProduct”。

此文件夹将包含 MyProduct.exe 可执行文件和相关 dll,以及 Microsoft Access 数据库文件 (.mdb)。快捷方式将在桌面上创建。当您运行 MyProduct.exe 时,它​​可以访问数据库而不会出现任何错误,并且可以执行 CRUD 操作。


新应用: 现在我已将 .Net 框架升级到 4.5.2 并使用 Installshield 创建安装程序。安装路径将是相同的“C:\Program Files (x86)\MyProduct”。

现在的问题是,当我执行 exe 并执行任何插入/更新/删除操作时,它会引发“操作必须使用可更新查询”的错误。这意味着无法访问数据库。我尝试以管理员用户身份运行该 exe,然后它才能正常工作。

我的操作系统是 Window 10。

注意:我修改了 database.mdb 属性,并为新旧版本的所有用户提供了 FullControl。但是没有管理员用户,新版本无法运行。

对于较新的版本,我将安装路径更改为“C:\My Folder\MyProduct”,它可以正常工作,没有任何错误。只有 C:\Program Files 给出错误。奇怪的是旧版本也安装在 Program Files 中,但它不会抛出任何错误。

新旧应用程序的另一个区别是,旧版本使用 Microsoft JET 引擎驱动程序来使用 Microsoft Access 数据库,而新版本使用 Microsoft ACE OLEDB 驱动程序来使用 Microsoft Access 数据库。

我不确定为什么会这样。旧版本可以工作,但新版本不行。 谁能帮我解决这个问题?

【问题讨论】:

你已经把它钉在了路径上。程序文件夹对于普通用户是只读的。因此,您必须将 .mdb 放到所有执行用户都具有写入权限的文件夹中。然后取决于是否需要在不同的本地用户之间共享数据库。 感谢@Falco,但它正在使用旧版本,这很奇怪。旧版本在程序文件中具有相同的安装路径。由于 .mdb 可以完全控制所有用户,旧的不需要管理员权限,而新的仍然需要。 也许旧设置明确设置 mdf 文件的文件权限以允许所有用户进行写访问?虽然这是可能的,但这是非常糟糕的做法。最好遵循 @FalcoAlexander 提供的建议,将其放入 CommonAppData(如果所有用户共享)或 LocalAppData 文件夹 Program Files 不是用户数据的文件夹,甚至不是程序数据。文件夹 ProgramData 用于此目的。试试看,你就会遵守规则——就像 InstallShield 似乎做的那样。 感谢大家的建议,我计划使用除 ProgramFiles 之外的其他位置作为数据库文件。 【参考方案1】:

我会将安装移动到 %userappdata% 或某个不需要提升权限的文件夹。虽然您可以将 .exe 放在程序文件中,但这些位置的任何数据文件现在往往拥有非常有限的权限(它们继续越来越多地锁定窗口)。

另外,要小心。即使你说安装到我的文档中?如果您在安装过程中需要提升权限,那么通常在安装过程中,您创建的文件和文件夹也将具有提升权限。

因此,不要将任何数据文件或代码必须读取的文件放入程序文件中。如今,此类系统文件夹往往受到限制并具有锁定权限。

%appdata% 是您最好的选择。在大多数情况下,这将转化为:

C:\Users\AlbertKallal\AppData\Roaming

这也意味着你的代码最好不要有硬编码的路径名。 (您从正在执行的程序集中获取/获取路径。如果您有很多代码,并且路径是硬编码的?那么您可以硬着头皮说安装到 c:\MyCoolApp 或您在 c:\ 中创建的某个文件夹驱动器。但是,有这么多人在做远程工作,那么即使是 c:\SomeFolder 也可能是一个糟糕的选择,因为在终端服务上,所有用户都共享同一个 c:\ 驱动器。

因此,将安装移出程序文件,或者至少将数据文件部分移出到所有用户默认情况下都有权访问的已知读/写文件夹,并且不需要提升权限即可使用此类文件夹.因此,请非常注意您在安装过程中拥有的任何数据文件部分。如前所述,%appdata% 是一个不错的选择,但请记住,可执行文件的路径名和数据文件位置将是动态的(用户名将是路径名的一部分)。如果您不认为您曾经支持终端服务或远程桌面?然后你可以在这里使用/冒险硬编码的 c:\MyApp 文件夹方法。

归根结底,您确实需要在安装期间避免提升权限,如果数据文件是安装的一部分,则尤其如此 - 因为这些文件也将在安装期间继承提升的权限。并且确定使用 10 或 15 年前常见的程序文件来处理程序和数据?好吧,程序部分还可以,但是现在任何数据文件都不能出于所有实际目的放在程序文件中。

【讨论】:

以上是关于C# Winform 应用程序仅以管理员身份运行的主要内容,如果未能解决你的问题,请参考以下文章

C# winform 怎么以管理员身份打开第三方APP

[Winform]默认以管理员身份运行程序

在Winform程序中设置管理员权限及为用户组添加写入权限

在Winform程序中设置管理员权限及为用户组添加写入权限

在Winform程序中设置管理员权限及为用户组添加写入权限

WINFORM 应用程序管理员身份执行