如何针对潜在的非正统硬盘驱动器字母进行防御编码

本文关键字:编码 硬盘驱动器 何针 非正统 | 更新日期: 2023-09-27 18:25:27

我可以将SaveFileDialog的InitialDirectory属性设置为我的应用程序通常安装的位置,如下所示:

saveFileDialog1.InitialDirectory = @"C:'Program Files'Waltons'Mountains";

但由于"每个人群中都有一个",有些人可能会使用C以外的驱动器号作为硬盘驱动器?如何将InitialDirectory设置为用户指定的驱动器号?

更新

我尝试了Alexei的代码(必须将"Concat"更改为"Combine"并删除多余的"):

saveFileDialog1.InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Programs), @"Waltons'Mountains");
DialogResult result = saveFileDialog1.ShowDialog();
if (result == DialogResult.OK)
{
    // TODO: Finish
}

但它不会打开C:''Program Files''Waltons''Mountains

更新2

Saeb的建议似乎奏效了,因为保存文件对话框在C:''Waltons''Mountains''bin''Debug 中打开

我希望/估计它将对应于用户机器上的C:''Walton(或D:''Walton或Z:''Walton或其他)。

我想我必须为用户附加"''Mapses"-检查它是否没有在Visual Studio或其他地方运行,并在该事件中附加它。

如何针对潜在的非正统硬盘驱动器字母进行防御编码

普通用户可写的位置将是保存对话框的默认位置。即通过Environment.GetFolderPath传递Environment.SpecialFolder值之一的"我的文档":

var pathToMyDocuments = Environment.GetFolderPath(Environment.SpecialFolder.Personal));

如果你需要你的程序默认安装的位置,比如程序文件

Path.Combine(
     Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "MyFolder");

或者如果你需要相对于程序的路径检查我如何才能获得应用程序';的路径?。

请注意,除非关闭UAC或明确地"以管理员身份运行"或更改这些文件夹的默认权限,否则普通用户甚至管理员都无法写入上述位置(绕过默认权限的方法都有缺点,如果允许普通用户在programs/system文件夹中写入,则应进行认真的安全审查)。

不要使用硬编码的驱动程序字母。在运行时查找路径。例如:

saveFileDialog1.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;

您可以使用环境变量systemroot来获取驱动器。尝试打开cmd提示符并输入set以查看所有可用环境变量的列表,然后使用System.Envrionment.GetEnvironmentVariable("systemdrive")并将其与路径的其余部分组合。