在Windows 7中对自己的exe目录中的c#app进行写访问

时间:2010-04-11 10:26:51

标签: c# windows-7 file-permissions

我知道Windows 7中的用户帐户默认是受限制的,因此程序不能只写在系统的任何地方(就像在Win XP中一样)。

但我认为有可能允许c#app在其自己的exe目录或其子文件夹中写入(至少不是所有的“用户设置”或应写入“MyDocuments”......)。

所以目前我的c#app在尝试在exe目录中写入时会抛出一个UnauthorizedAccessException。

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

4 个答案:

答案 0 :(得分:4)

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

你也可以provide a manifest file申请。

答案 1 :(得分:4)

  

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

是的,但是这段代码(更改权限)需要以管理员权限执行,所以你回到了开始。

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

答案 2 :(得分:1)

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

(当然,这会打开那些修改程序的用户。)

答案 3 :(得分:-2)

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

您可以通过右键单击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");
    }
}