2017-01-18 13 views
0

Я пишу сценарий DMS Powershell, поэтому я могу легко настроить среды разработки. Я пытаюсь установить Visual Studio 2012 для установки без открытия графического интерфейса.Visual Studio 12 VSIXInstaller сообщает об ошибке FileNotFoundException при запуске в скрипте DSC

Я загрузил файл Specflow .vsix. Когда я запускаю

& "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\VSIXInstaller.exe" /q C:\Users\Public\Downloads\TechTalk.SpecFlow.Vs2010Integration.vsix 

В командной строке Powershell он работает без сбоев. Но если я попытаюсь сделать то же самое в ресурсе DSC Script, у меня возникнут проблемы. Копирование и вставка команды выше в результаты SetScript в файле VSInstaller.exe приводит к тому, что команда никогда не заканчивается.

поэтому я попытался следующие, на основе Choco Install-VSIX командлета:

Script installSpecflowVS { 
     SetScript = {   
      $specUrl = 'https://visualstudiogallery.msdn.microsoft.com/9915524d-7fb0-43c3-bb3c-a8a14fbd40ee/file/79327/7/TechTalk.SpecFlow.Vs2010Integration.vsix' 
      $outfile = 'C:\Users\Public\DownloadsTechTalk.SpecFlow.Vs2010Integration.vsix' 
      wget $specUrl -outfile $outfile 
      $psi = New-Object System.Diagnostics.ProcessStartInfo 
      $psi.FileName='C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\VSIXInstaller.exe' 
      $psi.Arguments="/q $outfile" 
      $s = [System.Diagnostics.Process]::Start($psi) 
      $s.WaitForExit() 
      return $s.ExitCode 
     } 
     TestScript = { return $False } 
     GetScript = { return $True } 
} 

В этом случае, команда завершает, но VSIXInstall.exe бросает ошибку FileNotFound, которую я могу видеть из журнала, созданного в в C: \ Windows \ Temp \

1/18/2017 10:51:51 AM - Searching for applicable products... 
1/18/2017 10:51:51 AM - Found installed product - Microsoft Visual Studio Professional 2012 
1/18/2017 10:51:51 AM - System.IO.FileNotFoundException: The system cannot find the file specified. (Exception from HRESULT: 0x80070002) 
    at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) 
    at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode) 
    at Microsoft.VisualStudio.Settings.ExternalSettingsManager.GetScopePaths(String applicationPath, String suffixOrName, String vsVersion, Boolean isLogged, Boolean isForIsolatedApplication) 
    at Microsoft.VisualStudio.Settings.ExternalSettingsManager.CreateForApplication(String applicationPath) 
at VSIXInstaller.App.GetExtensionManager(SupportedVSSKU sku) 
at VSIXInstaller.App.GetExtensionManagerForApplicableSKU(SupportedVSSKU supportedSKU, IInstallableExtension installableExtension, List`1 applicableSKUs) 
at VSIXInstaller.App.InitializeInstall() 
at VSIXInstaller.App.OnStartup(StartupEventArgs e) 

Файл определенно существует; если поставить VSInstaller с чем-то, что не существует, она дает следующую ошибку вместо

1/18/2017 10:21:45 AM - VSIXInstaller.InvalidCommandLineException: Path to vsix file 'outfile' is invalid or you don't have required access permissions. Please check the path is valid and you have required access permissions. 

Скрипт работает локально на Windows, виртуальную машину 7 SP1 с Powershell 5. Я его выполнения с помощью Powershell ISE с администратора привилегии.

Существует, очевидно, что-то другое в отношении скриптов, запущенных через DSC Set-Script. Любые идеи, как исправить, чтобы исправить это? Или другой способ сделать это?

ответ

0

VSIX на пользователя, которому вы должны сообщить DSC, который пользователь должен установить его, используя PSDscRunAsCredential (добавленный в PowerShell 5.0).

Пример, где $credential - это учетные данные для пользователя, для которого вы хотите установить VSIX.

Script installSpecflowVS { 
     SetScript = {   
      $specUrl = 'https://visualstudiogallery.msdn.microsoft.com/9915524d-7fb0-43c3-bb3c-a8a14fbd40ee/file/79327/7/TechTalk.SpecFlow.Vs2010Integration.vsix' 
      $outfile = 'C:\Users\Public\DownloadsTechTalk.SpecFlow.Vs2010Integration.vsix' 
      wget $specUrl -outfile $outfile 
      $psi = New-Object System.Diagnostics.ProcessStartInfo 
      $psi.FileName='C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\VSIXInstaller.exe' 
      $psi.Arguments="/q $outfile" 
      $s = [System.Diagnostics.Process]::Start($psi) 
      $s.WaitForExit() 
      return $s.ExitCode 
     } 
     TestScript = { return $False } 
     GetScript = { return $True } 
     PSDscRunAsCredential = $credential 
} 

Также см Securing the MOF File о том, как правильно зашифровать файл MOF, так что вы не утечка учетных данных.