【问题标题】:Write-access for c# app in its own exe dir in Windows 7在 Windows 7 中其自己的 exe 目录中对 c# 应用程序的写访问
【发布时间】:2011-02-06 16:26:59
【问题描述】:

我知道默认情况下 Windows 7 中的用户帐户受到限制,因此程序不能只在系统上的任何位置写入(就像在 Win XP 中那样)。

但我认为有可能,例如允许 c# 应用程序写入它自己的 exe 目录或至少它的子文件夹(并非所有内容都是“用户设置”或应写入“MyDocuments”...)。

所以目前我的 c# 应用程序在尝试在 exe 目录中写入时抛出 UnauthorizedAccessException。

您可以在 c# 代码中做些什么来允许在 exe 目录中写入吗?

【问题讨论】:

  • 可执行文件是否在程序文件目录中?在 Windows 7 中,您不能读取/写入 Program Files 下的文件。
  • @Rody: 当然你可以读取 Program Files...中的文件...
  • 为什么需要这样做?用户被拒绝访问是有充分理由的——在大多数情况下,您尝试完成的工作可能是通过使用不同的存储位置来满足的。您要存储/更改哪些数据要写入程序文件夹?
  • @Heinzi:你说得对,我只写了。即使在权限较低的帐户下运行,当然也允许读取访问权限。
  • 自 1999 年发布的 Windows 2000 以来,您无法使用用户级登录写入程序文件夹或 C: 的根目录。

标签: c# windows-7 file-permissions


【解决方案1】:

是的。

将程序安装在用户具有写入/修改权限的位置。

(当然,这会让你看到那些修改你的程序的用户。)

【讨论】:

    【解决方案2】:

    您可以在 c# 代码中做些什么来允许在 exe 目录中写入吗?

    是的,但是此代码(更改权限)需要以管理员权限执行,因此您又回到了起点。

    在我看来,正确的方法是在安装软件期间通过自定义操作为C:\ProgramData(实际上是:Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData))下的目录设置适当的写入权限。

    【讨论】:

    • 您无需执行任何操作即可在 ProgramData 下获得写入权限
    • @Henk:有点复杂:是的,每个(非管理员)用户都可以在 ProgramData 中创建文件夹和文件,但默认情况下,其他(非管理员)用户不能修改这些文件,所以我想这不是弗里茨需要的。
    • @Heinzi:我和你上面所说的情况一样。我需要其他(非管理员)用户来修改这些文件,你能指导我在通过 c# 访问时授予文件权限吗
    • @KumaranT:这是创建自定义操作的方法:msdn.microsoft.com/en-us/library/d9k65z2d.aspx,这是一个 SO 问题,展示了如何在 C# 中设置目录权限 (ACL):stackoverflow.com/q/507124/87698
    【解决方案3】:

    不,如果您的应用程序在其下运行的用户没有写入此文件夹的权限,则您无法写入该文件夹。安装应用程序时(可能通过 MSI),您可以授予必要的权限。

    您也可以使用您的应用程序provide a manifest file

    【讨论】:

    • 可以这样做,但我敢打赌你不应该。拒绝访问该文件夹是有原因的;对于弗里茨的问题,很可能有更明智的推荐解决方案。
    • 谢谢,我可以通过在我的设置工具中授予正确的权限来解决问题。在 innosetup 中,这可以通过以下方式完成:[Dirs] Name: {app};权限:所有人修改;
    • @fritz:但是请注意,这会打开一个安全漏洞,因为每个“普通”用户现在都可以用其他东西替换您的 exe,一些邪恶的东西。
    • @Dan:我们也必须在我们的组织中使用它。我们有数百台 PC 和数千名没有 PC 登录的员工。我们的系统管理员创建了一个名为“Public”的帐户,该帐户无权访问常见的特殊文件夹(ApplicationData、CommonApplicationData、LocalApplicationData、ProgramFiles)。某些数据(如设置和日志文件)不应写入桌面或 MyDocuments。在这种情况下,我使用安装程序修改了我的应用程序,让它们写入特定文件夹。
    【解决方案4】:

    是的,您应该确保您的程序以管理员权限运行。

    您可以通过右键单击 exec 并单击“以管理员身份运行”来手动执行此操作,或者您可以要求程序以管理员权限运行。

    WindowsPrincipal pricipal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
    bool hasAdministrativeRight = pricipal.IsInRole(WindowsBuiltInRole.Administrator);
    if (!hasAdministrativeRight)
    {
       RunElevated(Application.ExecutablePath);
       Environment.Exit(0);
    }
    
    private static void RunElevated(string fileName)
    {
        ProcessStartInfo processInfo = new ProcessStartInfo();
        processInfo.Verb = "runas";
    processInfo.FileName = fileName;
        try
        {
            Process.Start(processInfo);
        }
        catch (Win32Exception)
        {
            MessageBox.Show("Program needs administrator rights");
        }
    }
    

    【讨论】:

    • 在管理帐户下运行应用程序不是一个好主意,因为它可能存在潜在的安全风险。
    猜你喜欢
    • 2013-11-13
    • 2011-03-09
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 2011-03-22
    相关资源
    最近更新 更多