C# 将文件复制到Visual Studio时拒绝访问';s安装文件夹

C# 将文件复制到Visual Studio时拒绝访问';s安装文件夹,c#,visual-studio,security,vspackage,C#,Visual Studio,Security,Vspackage,我正在为Visual Studio 2013编写一个VSPackage。这个包应该下载一些XML模式文件,然后将它们复制到Visual Studio的%安装文件夹%\XML\Schemas 我使用WebClient下载文件。当我将目标文件夹设置为像C:\Test这样的文件夹时,它工作得非常好。以下是执行此操作的代码: webclient.DownloadFileAsync(url, "% Destination Folder Here %"); 问题: 当我将目标foder设置为“C:\Pro

我正在为Visual Studio 2013编写一个
VSPackage
。这个包应该下载一些XML模式文件,然后将它们复制到Visual Studio的
%安装文件夹%\XML\Schemas

我使用
WebClient
下载文件。当我将目标文件夹设置为像
C:\Test
这样的文件夹时,它工作得非常好。以下是执行此操作的代码:

webclient.DownloadFileAsync(url, "% Destination Folder Here %");
问题:

当我将目标foder设置为
“C:\Program Files(x86)\Microsoft Visual Studio 12.0\Xml\Schemas”
”时,出现以下错误:

对路径“C:\Program Files(x86)\Microsoft Visual Studio 12.0\Xml\Schemas”的访问被拒绝

我试过:

1-在Windows中手动更改文件夹权限

2-(我更愿意这样做)使用C#更改代码中的访问权限:

问题


我的应用程序如何将一些文件复制到Visual Studio安装文件夹中?

这需要管理员权限,而VS 2008或更高版本默认情况下不运行提升版(具有管理员权限),用户应使用“以管理员身份运行”上下文菜单项启动VS。软件包不应强制用户执行此操作,这意味着软件包无法将文件复制到C:\Program files(x86)(或写入注册表配置单元HKEY_LOCAL_MACHINE)


软件包的设置可以做到这一点(默认情况下,设置可以使用管理员权限运行,如果这样设计的话),但软件包不能。

您是否尝试过在应用程序上以管理员身份运行
?您需要将进程提升到管理员组(正如sstan所说),以便能够写入程序文件(或程序文件x86)目录。不管你是否更改文件夹的权限。我正在调试模式下运行代码。作为管理员如何调试/编译代码?谢谢如果您在调试模式下运行,那么我相信您需要在
以管理员身份运行
模式下运行Visual Studio本身。在管理员模式下运行VS不会将您的进程提升为管理员。为了提升流程,您需要向app.config文件添加一些信息。请参见我以
管理员的身份运行VisualStudio,VSPackage能够复制文件。现在,如果用户不是以管理员身份运行VisualStudio,我的VSPackage如何向用户请求管理员权限或以某种方式复制文件?
ApplicationVariables.SCHEMA_PATH = @"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Xml\Schemas";

//  Set access to the schema directory.
DirectoryInfo schemaDirectoryInfo = new DirectoryInfo(ApplicationVariables.SCHEMA_PATH);
DirectorySecurity schemadirectorySecurity = schemaDirectoryInfo.GetAccessControl();
schemadirectorySecurity.AddAccessRule(
     new FileSystemAccessRule(
            new SecurityIdentifier(WellKnownSidType.WorldSid, null),
            FileSystemRights.FullControl,
            AccessControlType.Allow)
            );

// I also have tried this
        FileIOPermission filePermission = new FileIOPermission(FileIOPermissionAccess.AllAccess, ApplicationVariables.SCHEMA_PATH);
        try
        {
            filePermission.Demand();
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Security Error = " + ex.Message);
        }