MSB4175错误:CodeTaskFactory加载失败,权限不足求助
首先得说,这个问题大概率是Windows 10 1803升级后系统权限管控变严导致的——GitLab Runner服务默认的运行账户没足够权限加载MSBuild的CodeTaskFactory组件,而你本地命令行用自己的账户跑,权限够所以没问题。
给你几个针对性的解决方案,按顺序试试:
方案1:给GitLab Runner服务提权
打开Windows服务管理器(按Win+R输入services.msc即可),找到GitLab Runner服务,右键选择「属性」→「登录」标签页,把运行账户换成拥有管理员权限的本地账户(比如你日常使用的账户,或者专门的管理员账号),修改完成后记得重启服务。这样Runner进程就能拿到足够权限访问MSBuild的核心程序集了。
方案2:调整MSBuild任务的程序集引用路径
你现在.csproj里引用的是32位VS目录下的Microsoft.Build.Tasks.Core.dll,试试换成64位路径,或者用$(MSBuildBinPath)变量替代$(MSBuildToolsPath):
<UsingTask TaskName="GetPackageVersion" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildBinPath)\Microsoft.Build.Tasks.Core.dll">
也可以直接写绝对路径指向64位MSBuild目录:
<UsingTask TaskName="GetPackageVersion" TaskFactory="CodeTaskFactory" AssemblyFile="C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\bin\Microsoft.Build.Tasks.Core.dll">
方案3:让GitLab Runner以管理员身份运行
找到GitLab Runner的执行文件(一般在C:\Multi-Runner\目录里),右键选择「属性」→「兼容性」,勾选「以管理员身份运行此程序」,点击应用保存。这样每次Runner启动都会带着管理员权限,能避开UAC的权限限制。
方案4:绕开CodeTaskFactory,用PowerShell替代自定义任务
如果上面的方法都不行,干脆把读取版本号的自定义任务换成PowerShell脚本,彻底避开CodeTaskFactory的权限问题。修改你的GetZip目标:
<Target Name="GetZip"> <!-- 用PowerShell读取Package.appxmanifest里的版本号 --> <Exec Command='powershell -Command "$doc = [xml](Get-Content Package.appxmanifest); $version = $doc.Package.Identity.Version; Write-Output $version"' > <Output TaskParameter="Outputs" PropertyName="PackageVersion" /> </Exec> <!-- 后续的文件收集和压缩任务保持不变 --> <ItemGroup> <BinDirectoryFiles Include="$(MSBuildProjectDirectory)\AppPackages\MyApp_$(PackageVersion)_x86_MyApp_Test\**\*.*" /> </ItemGroup> <Zip Files="@(BinDirectoryFiles)" WorkingDirectory="$(MSBuildProjectDirectory)\AppPackages\MyApp_$(PackageVersion)_x86_MyApp_Test" ZipFileName="$(MSBuildProjectDirectory)\Zip\MyApp_$(PackageVersion).zip" /> </Target>
改完之后提交代码触发构建,应该就能正常执行Zip目标了。如果还有问题,去查看GitLab Runner的日志,排查下是不是还有其他权限相关的细节没处理到。
内容的提问来源于stack exchange,提问作者newone

