如何使用MSBuild将文件复制到需要密码的网络共享?

如何使用MSBuild将文件复制到需要密码的网络共享?,msbuild,msbuild-task,Msbuild,Msbuild Task,我已经创建了一个MSBuild.xml文件来自动化我们的ASP.NET项目构建。它构建项目、发布项目、压缩项目并将zip复制到网络共享。如果我之前已经登录到网络文件夹,那么这一切都可以完美地工作。在我访问网络共享后,用户名和密码将被记住,直到我注销我的计算机。如果我以前没有登录,那么在运行构建文件时会出现“失败:未知用户名或错误密码”错误。我希望无论我以前是否访问过网络共享,构建都能一直工作 目前,我正在使用复制任务将zip文件复制到网络共享。我已经查看了复制任务文档,但看不到任何包含凭据的方法

我已经创建了一个MSBuild.xml文件来自动化我们的ASP.NET项目构建。它构建项目、发布项目、压缩项目并将zip复制到网络共享。如果我之前已经登录到网络文件夹,那么这一切都可以完美地工作。在我访问网络共享后,用户名和密码将被记住,直到我注销我的计算机。如果我以前没有登录,那么在运行构建文件时会出现“失败:未知用户名或错误密码”错误。我希望无论我以前是否访问过网络共享,构建都能一直工作

目前,我正在使用复制任务将zip文件复制到网络共享。我已经查看了复制任务文档,但看不到任何包含凭据的方法。那么,如何通过所需的用户名和密码将文件复制到网络共享

下面是我正在使用的复制任务的一个示例。所有属性都在MSBuild.xml文件的顶部定义:

<Target Name="CopyToServer">
    <Copy SourceFiles="$(ReleaseFolder)\$(ZipFileName).zip" DestinationFolder="$(WebServerRoot)" />
</Target>

我建议创建特殊帐户,比如说builder,并在远程计算机上为该帐户共享提供读/写访问权限


或者您可以在计算机启动时调用脚本来打开会话。请参阅网络使用/?我找到了一个解决方案。我对它并不完全满意,但在我找到更好的解决方案之前,我会满意的

如果从批处理文件运行MSBuild命令,则可以使用runas命令以具有访问网络共享所需权限的用户身份运行MSBuild

例如


我也有同样的问题。但我不想每次使用
RunAs
部署应用程序时都输入密码。 相反,我通过
Exec>使用
net use
包装的
Copy
任务:

<Target Name="CopyOutput">
    <ItemGroup>
        <PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Exec Command="net use $(DestPath) /user:$(DestLogin) $(DestPass)" ContinueOnError="false"/>
    <Copy SourceFiles="@(PackagedFiles)" 
          DestinationFiles="@(PackagedFiles->'$(DestPath)\%(RecursiveDir)%(Filename)%(Extension)')"
          ContinueOnError="true"/>
    <Exec Command="net use $(DestPath) /delete" />
</Target>

通过环境变量设置DestPath、DestLogin和DestPass

多亏了菲尔的回答和支持

<Target Name="CopyOutput">
    <ItemGroup>
        <PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Exec Command="net use $(DestPath) /user:$(DestLogin) $(DestPass)" ContinueOnError="false"/>
    <Copy SourceFiles="@(PackagedFiles)" 
          DestinationFiles="@(PackagedFiles->'$(DestPath)\%(RecursiveDir)%(Filename)%(Extension)')"
          ContinueOnError="true"/>
    <Exec Command="net use $(DestPath) /delete" />
</Target>