简体   繁体   中英

Unable to find repository on Update-Module

I'm using Windows 10 and Powershell 5.1

Get-PSRepository has result :

PSGallery Untrusted https://www.powershellgallery.com/api/v2

whereas Update-Module returns error

PackageManagement\\Install-Package : Unable to find repository ' https://www.powershellgallery.com/api/v2/ '. Use Get-PSRepository to see all available repositories. At C:\\Program Files\\WindowsPowerShell\\Modules\\powershellget\\2.0.1\\PSModule.psm1:13000 char:20 + ... $sid = PackageManagement\\Install-Package @PSBoundParameters + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package], Ex ception + FullyQualifiedErrorId : SourceNotFound,Microsoft.PowerShell.PackageManagement.Cmdlets.InstallPackage

Any idea of how to fix it?

TL;DR

It looks like the URL for the PSGallery repository registered in PowerShell used to point to https://www.powershellgallery.com/api/v2/ but it was changed to https://www.powershellgallery.com/api/v2 at some point (note the missing forward slash at the end).

λ  Get-PSRepository

Name                      InstallationPolicy   SourceLocation
----                      ------------------   --------------
PSGallery                 Untrusted            https://www.powershellgallery.com/api/v2

Any modules installed from the old URL are now failing to update. Reinstalling them from PowerShell gallery will update the repository URL, allowing the modules to be updated normally going forward. You can use the following command to reinstall all modules pointing to the old URL:

Get-InstalledModule `
| ? { $_.Repository -eq 'https://www.powershellgallery.com/api/v2/' } `
| % { Install-Package -Name $_.Name -Source PSGallery -Force -AcceptLicense }

The full run down

I have run into this incredibly annoying issue myself. From the error message we can see a couple of things:

PackageManagement\\Install-Package : Unable to find repository ' https://www.powershellgallery.com/api/v2/ '

  1. PowerShellGet\\Update-Module ultimately passes the buck to PackageManagement\\Install-Package
  2. It is looking for a repository at ' https://www.powershellgallery.com/api/v2/ '

Running Get-PSRepository on my machine yields:

Name                      InstallationPolicy   SourceLocation
----                      ------------------   --------------
PSGallery                 Trusted              https://www.powershellgallery.com/api/v2

So it looks like the repository is there, except, maybe it isn't. Take note of the trailing forward slash. Could it be that Install-Package is looking for a repository with a SourceLocation that exactly matches that string? Let's try changing the SourceLocation for PSGallery:

Set-PSRepository -Name PSGallery -SourceLocation https://www.powershellgallery.com/api/v2/ -InstallationPolicy Trusted

PackageManagement\\Set-PackageSource : The PSGallery repository has pre-defined locations. The 'Location, NewLocation or SourceLocation' parameter is not allowed, try again after removing the 'Location, NewLocation or SourceLocation' parameter. At C:\\Program Files\\WindowsPowerShell\\Modules\\PowerShellGet\\2.0.4\\PSModule.psm1:11768 char:17 + ... $null = PackageManagement\\Set-PackageSource @PSBoundParameters + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: ( https://www.pow...ery.com/api/v2/:String ) [Set-PackageSource], Exception + FullyQualifiedErrorId : ParameterIsNotAllowedWithPSGallery,Add-PackageSource,Microsoft.PowerShell.PackageManagement.Cmdlets.SetPackageSource

Well, that didn't work. Looks like the PSGallery repository is protected for your safety .

Let's trying adding a different repository and updating a module:

Register-PSRepository -Name PSGallery1 -SourceLocation https://www.powershellgallery.com/api/v2/ -InstallationPolicy Trusted
Update-Module -Name pester -Force

Look, no error. It works!

Here is the interesting thing, if I pull up a list of installed modules I find a mix of repositories:

Get-InstalledModule | Select Name, Repository | FT -AutoSize

Name                         Repository
----                         ----------
7Zip4Powershell              PSGallery 
AWSPowerShell                PSGallery 
cChoco                       PSGallery1
dbatools                     PSGallery 
DLMAutomation                PSGallery1
InvokeBuild                  PSGallery1
Microsoft.PowerShell.Archive PSGallery1
PackageManagement            PSGallery 
Pester                       PSGallery1
posh-git                     PSGallery1
powershell-yaml              PSGallery1
PowerShellGet                PSGallery 
PowerUpSQL                   PSGallery1
psake                        PSGallery1
PsHosts                      PSGallery1
psTrustedHosts               PSGallery1
ReverseDSC                   PSGallery1
SeeShell                     PSGallery1
SqlServer                    PSGallery1
TunableSSLValidator          PSGallery1
xSmbShare                    PSGallery1
xWebAdministration           PSGallery1

Look at all those modules installed form PSGallery1 which is associated with https://www.powershellgallery.com/api/v2/ ! Prior to just now, there has never been a repository on my machine called PSGallery1; every module I have ever installed has been from PSGallery. My guess is that the PSGallery repository used to point to https://www.powershellgallery.com/api/v2/ and at some point, intentionally or not, it was changed to https://www.powershellgallery.com/avp/v2 ; breaking Update-Module for any modules installed from the previous URL. I suspect that if I reinstall the modules using Install-Package from the updated PSGallery repository everything will resolve itself and I can remove the PSGallery1 repository.

Let's update all the modules that were deployed from the old URL (PSGallery1):

Get-InstalledModule `
| ? { $_.Repository -eq 'PSGallery1' } `
| % { Install-Package -Name $_.Name -Source PSGallery -Force -AcceptLicense }

Running Get-InstalledModule again yields:

Name                         Repository
----                         ----------
7Zip4Powershell              PSGallery
AWSPowerShell                PSGallery
cChoco                       PSGallery
dbatools                     PSGallery
DLMAutomation                PSGallery
InvokeBuild                  PSGallery
Microsoft.PowerShell.Archive PSGallery
PackageManagement            PSGallery
Pester                       PSGallery
posh-git                     PSGallery
powershell-yaml              PSGallery
PowerShellGet                PSGallery
PowerUpSQL                   PSGallery
psake                        PSGallery
PsHosts                      PSGallery
psTrustedHosts               PSGallery
ReverseDSC                   PSGallery
SeeShell                     PSGallery
SqlServer                    PSGallery
TunableSSLValidator          PSGallery
xSmbShare                    PSGallery
xWebAdministration           PSGallery

Great! Now let's try removing the PSGallery1 repository and updating a module:

Unregister-PSRepository PSGallery1
Update-Module -Name pester -Force

Success! The module updated without error.

I'm not sure what is broken here, the URL for the PSGallery repository or Install-Package , but reinstalling all modules that were installed from the old URL seems to fix everything.

After trying all kinds of things, forcing a reinstall of the NuGet package provider seems to have cleared up the issue with Update-Module for me.

Execute this in an elevated PowerShell session:

Install-PackageProvider Nuget –Force

For reference, I was here when I had my best success: https://docs.microsoft.com/en-us/powershell/scripting/gallery/installing-psget

I had the same problem and found this question. I tried everything that Jason Boyd (above) wrote about, but it did not work.

Searched some more and found this link https://community.spiceworks.com/topic/2265662-powershell-get-download-problem

where it said TLS 1.0 could be the culpit. It suggests running

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 

After that, I was able to update my packages.

The combination of the above answers fixed it for me.

PS> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
PS> Install-PackageProvider Nuget –Force
PS> Install-Module -Name PSWindowsUpdate

You may need to remove the old version of PSWindowsUpdate first to install the new version.

You can do a -force and it would install two versions side-by-side, but that probably isn't the best idea.

I have the same problem with Windows Powershell 5.1.17134.407 and also tested on the same machine on PowerShell 6.1. Update-Module works as expected with PowerShell 6.1 with the same version of the PowerShellGet module in both Windows PowerShell and PowerShell. So, it looks like the problem is unique to Windows PowerShell and making a guess without further testing, is a problem within the Update-Module code in the PowerShellGet module itself when running on Windows PowerShell.

I don't have a solution for you using Update-Module but as a work around you can use Install-Module instead with the -AllowClobber parameter. It does not fail with this error like Update-Module does. And, right now at least, the end result will be the same since Update-Module actually just installs a new version side-by-side with any older version(s) that are installed per my testing and per https://github.com/PowerShell/PowerShellGet/issues/213 .

...

After doing some further testing I happened to reboot the system I was testing on. After reboot the issue with Update-Module in Windows PowerShell 5.1 was resolved - Update-Module now works as expected. I cannot say for sure that the reboot is what resolved it, but it is now resolved.

I tried this but i did get the PSGaller2 thing going. So i looked further for a sollution. Since i am in a VPN / Proxy envirenmont i did not get the updated to work. When i dit this it worked for me.

$webclient=New-Object System.Net.WebClient
$webclient.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

For me these is the code that worked:

powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" 

$env:Path += ";C:\ProgramData\chocolatey\bin"

I found similar issue. In my case, it was happening due to TLS.

I followed below steps to resolve the issue as follows: 1. Set strong cryptography on 64 bit .Net Framework (version 4 and above) Set-ItemProperty -Path 'HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft.NetFramework\\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type Dword

  1. set strong cryptography on 32 bit .Net Framework (version 4 and above) Set-ItemProperty -Path 'HKLM:\\SOFTWARE\\Microsoft.NetFramework\\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type Dword

  2. Restart PS console

  3. Check for supported protocols by using[Net.ServicePointManager]::SecurityProtocol

  4. Register Default Register-PSRepository -Default

Try this:

[System.Net.WebRequest]::DefaultWebProxy.Credentials = System.Net.CredentialCache]::DefaultCredentials

get-psrepository

register-psrepository -default

Fix:

  1. Install-Module -Name PowershellGet -Repository PSGallery -Force
  2. Close the existing PowerShell or ISE session and start a new one
  3. Update-Module

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM