【问题标题】:Why does it required UAC for changing files?为什么需要 UAC 来更改文件?
【发布时间】:2014-01-14 13:41:07
【问题描述】:

我创建了一个具有 ini 文件和 db.mdb(访问)的应用程序,它将一些图像从 web 下载到 App 附近的文件夹中。

嗯,我用 Setup Factory Software 创建了一个安装文件。一切似乎都很好,我启动了我的应用程序,它没有改变 ini 文件的值,没有下载图像,也没有向 db 插入任何记录。

这是我的应用程序的路径,C:\Program Files (x86)\XXXXXXX

这是将行插入到 db 的代码

public void AddChannels(List<MediaChannel> list)
{

 string connectionString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source=data\\db.mdb;";
 try
 {
  using (OleDbConnection connection = new OleDbConnection(connectionString))
  {
   OleDbCommand cmd = new OleDbCommand();
   cmd.Connection = connection;

   connection.Open();


   int tmp1;
   string tmpstr;
   foreach (var mediaChannel in list)
   {
    tmp1 = mediaChannel.ImagePath.LastIndexOf('/');
    tmpstr = mediaChannel.ImagePath.Substring(tmp1+ 1, mediaChannel.ImagePath.Length - tmp1 - 1);

    cmd.CommandText = "Insert Into Channels(ChannelName,CategoryName,Url,ImagePath,ChannelType) values(@ChannelName,@CategoryName,@Url,@ImagePath,@ChannelType)";
       cmd.Parameters.AddWithValue("@ChannelName", mediaChannel.Name);
       cmd.Parameters.AddWithValue("@CategoryName", mediaChannel.CategoryName);
       cmd.Parameters.AddWithValue("@Url", mediaChannel.Url);
       cmd.Parameters.AddWithValue("@ImagePath", tmpstr);
       cmd.Parameters.AddWithValue("@ChannelType", (int)mediaChannel.ChannelType);
       cmd.ExecuteNonQuery();
      cmd.Parameters.Clear();
   }
  connection.Close();
 }
} 
catch (Exception ex)
{

throw new Exception(ex.Message);
}
}

这是我的图片下载方法

private void DownloadLogo()
{

string localFilename = Application.StartupPath + @"\Imgs\";
if (!Directory.Exists(localFilename))
Directory.CreateDirectory(localFilename);

foreach (var mediaChannel in channelList)
{

string imgName = mediaChannel.ImagePath;
if (imgName.Contains("http://"))
{
int tmp1 = mediaChannel.ImagePath.LastIndexOf('/');
imgName = mediaChannel.ImagePath.Substring(tmp1 + 1, mediaChannel.ImagePath.Length - tmp1 - 1);

}


if (!File.Exists(localFilename + imgName))
{


using (var client = new WebClient())
{

client.DownloadFile(mediaChannel.ImagePath, localFilename + imgName);
}
}
}
}

一切看起来都很好,我从来没有遇到过这种问题。如果我以管理员身份运行我的程序,它可以工作...

还有一件事,我打开了位于 C:\Program Files (x86)\XXXXXXX\data 中的数据库 我使用了 MS Access,有趣的是,我无法编辑表格。它说我需要保存为更改文件。我认为程序文件(86)受 UAC 保护。我的操作系统是 Windows 8 Professional。

也许安装程序会这样?因为安装屏蔽设置的许可证有限,我无法使用 Visual Studio 设置,所以我使用了第 3 部分设置制造商应用程序。

那么,如何解决这个问题呢?我的客户正在等待我解决此问题..

【问题讨论】:

    标签: c# installation uac program-files administrative


    【解决方案1】:

    您可能需要使用 AppData 文件夹而不是 Program Files 文件夹。 检查这个类似的问题Saving a file to Application Data in c#

    【讨论】:

    • 感谢 Radenko 的回答,这正是我想要的。正如马修所说,要在所有用户之间共享数据库,ProgramData 看起来更好,对吧?有没有像UAC这样的要求?
    • AppData 文件夹特定于每个用户,因此仅当您希望为每个用户单独的数据库文件时才使用该文件夹。如果要在所有用户之间共享数据库文件,则需要改用 ProgramData。
    • @ertan2002 你不应该需要 UAC 来访问 ProgramData 下的文件夹。
    • 谢谢@MatthewWatson,我会用这个文件夹,但我不知道XP用户有没有,希望对他们没有问题:))
    • @ertan2002:您应该使用它来获取基本文件夹:string dataFolder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);(它应该在 XP 和 Windows 7 或 8 下获得正确的路径。)然后在其下创建一个特定于应用程序的文件夹并在其中安装数据库文件。
    【解决方案2】:

    您正在尝试修改Program Files 中的文件。这是文件系统的一个区域,它不是为可变应用程序数据设计的——它基本上是只读的。对该区域的修改是可疑的,因此会出现 UAC 提示。

    您应该通过将数据存储在文件系统中更合适的位置来解决此问题。确切的位置将取决于您的应用程序正在尝试做什么。 (它是一项服务,还是只是一个本地客户端应用程序?数据是特定于登录用户还是计算机范围的?)

    【讨论】:

    • 感谢您的解释,我完全理解,Radenko Zec 的解决方案是我需要做的
    【解决方案3】:

    我终于解决了问题所在.. 我给了我的文件写权限,一切正常。

    http://www.indigorose.com/webhelp/suf9/Program_Reference/Actions/File.SetPermissions.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 2020-04-29
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2010-09-09
      相关资源
      最近更新 更多