Powershell Cmdlet缺少程序集Google Api
本文关键字:Google Api 程序集 Cmdlet Powershell | 更新日期: 2023-09-27 18:29:52
只有在尝试创建Powershell Cmdlet时才会出现问题。我可以在控制台应用程序的进程记录中执行相同的代码。当时的想法是,App.config没有重定向程序集,但没有成功地使其工作。我使用了nuget包来引用Google api dotnet客户端
此处的示例代码
http://tinyurl.com/mbx3yle
错误
https://i.stack.imgur.com/Nr3zR.png
Get-GAppsUsers : Could not load file or assembly 'System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
PsTest.cs
using System.ComponentModel;
using System.Collections.Generic;
using Google.Apis.Admin.Directory.directory_v1.Data;
using System.Management.Automation;
using System;
using Google.Apis.Admin.Directory.directory_v1;
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using Google.Apis.Services;
using Google.Apis.Util;
using System.Security.Cryptography.X509Certificates;
namespace PSTest
{
[RunInstaller(true)]
public class PsTest : PSSnapIn
{
/// <summary>
/// Specify a description of the PowerShell snap-in.
/// </summary>
public override string Description
{
get
{
return "This is a PowerShell snap-in that includes the Google Apps Lib";
}
}
/// <summary>
/// Specify the localization resource information for the description.
/// Use the format: resourceBaseName,Description.
/// </summary>
public override string DescriptionResource
{
get
{
return "GoogleAppsPSSnapIn,This is a PowerShell snap-in that includes the Google Apps Lib";
}
}
/// <summary>
/// Specify the name of the PowerShell snap-in.
/// </summary>
public override string Name
{
get
{
return "GoogleApps";
}
}
/// <summary>
/// Specify the vendor for the PowerShell snap-in.
/// </summary>
public override string Vendor
{
get
{
return "somecompany";
}
}
/// <summary>
/// Specify the localization resource information for the vendor.
/// Use the format: resourceBaseName,VendorName.
/// </summary>
public override string VendorResource
{
get
{
return "GoogleAppsPSSnapIn,somecompany";
}
}
}
[Cmdlet("Get", "GAppsUsers")]
public class GetGAppsUsers : PSCmdlet
{
protected override void ProcessRecord()
{
const string _serviceAccountCertPath = @"C:'cert.p12";
const string _serviceAccountEmail = @"id@developer.gserviceaccount.com";
const string _serviceAccountUser = @"someone@somewhere.com";
var certificate = new X509Certificate2(
_serviceAccountCertPath, "notasecret", X509KeyStorageFlags.Exportable);
var scopes = DirectoryService.Scopes.AdminDirectoryUser.GetStringValue() + @" " +
DirectoryService.Scopes.AdminDirectoryGroup.GetStringValue() + @" " +
DirectoryService.Scopes.AdminDirectoryOrgunit.GetStringValue() + @" " +
DirectoryService.Scopes.AdminDirectoryDeviceChromeos.GetStringValue() + @" " +
DirectoryService.Scopes.AdminDirectoryDeviceMobile.GetStringValue() + @" " +
DirectoryService.Scopes.AdminDirectoryDeviceMobileAction.GetStringValue();
var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
{
ServiceAccountId = _serviceAccountEmail,
Scope = @scopes
};
if (_serviceAccountUser != string.Empty)
{
provider.ServiceAccountUser = _serviceAccountUser;
}
var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);
var _directoryService = new DirectoryService((new BaseClientService.Initializer() { Authenticator = auth }));
var service = _directoryService.Users.List();
service.Customer = "my_customer";
service.OrderBy = UsersResource.ListRequest.OrderByEnum.FamilyName;
service.SortOrder = UsersResource.ListRequest.SortOrderEnum.ASCENDING;
service.MaxResults = 500;
var allUsers = new List<User>();
var users = service.Execute();
Int64 count = 0;
if (String.IsNullOrEmpty(users.NextPageToken))
{
service.PageToken = users.NextPageToken;
allUsers.AddRange(users.UsersValue);
count = (count + users.UsersValue.Count);
Console.Write(count + "...");
}
while (!String.IsNullOrEmpty(users.NextPageToken))
{
service.PageToken = users.NextPageToken;
allUsers.AddRange(users.UsersValue);
count = (count + users.UsersValue.Count);
Console.Write(count + "...");
users = service.Execute();
if (String.IsNullOrEmpty(users.NextPageToken))
{
service.PageToken = users.NextPageToken;
allUsers.AddRange(users.UsersValue);
count = (count + users.UsersValue.Count);
Console.Write(count + "...");
}
}
WriteObject(allUsers);
}
}
}
应用程序配置
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.1.10.0" newVersion="2.1.10.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.1.10.0" newVersion="2.1.10.0"/>
</dependentAssembly>
</assemblyBinding>
<loadfromRemoteSources enabled="true"/>
</runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
融合日志
*** Assembly Binder Log Entry (8/31/2013 @ 8:02:43 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:'Windows'Microsoft.NET'Framework64'v4.0.30319'clr.dll
Running under executable C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = NinjaWinMontage'mosheldon
LOG: DisplayName = System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Windows/System32/WindowsPowerShell/v1.0/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = powershell.exe
Calling assembly : Google.Apis, Version=1.5.0.28972, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: Using application configuration file: C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:'Windows'Microsoft.NET'Framework64'v4.0.30319'config'machine.config.
LOG: Post-policy reference: System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:'Users'mosheldon'Desktop'PSTest'PSTest'bin'Debug'System.Net.Http.Primitives.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: System.Net.Http.Primitives, Version=2.1.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: All probing URLs attempted and failed.
*** Assembly Binder Log Entry (8/31/2013 @ 8:02:43 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:'Windows'Microsoft.NET'Framework64'v4.0.30319'clr.dll
Running under executable C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = NinjaWinMontage'mosheldon
LOG: DisplayName = System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Windows/System32/WindowsPowerShell/v1.0/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = powershell.exe
Calling assembly : Google.Apis, Version=1.5.0.28972, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: Using application configuration file: C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:'Windows'Microsoft.NET'Framework64'v4.0.30319'config'machine.config.
LOG: Post-policy reference: System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:'Users'mosheldon'Desktop'PSTest'PSTest'bin'Debug'System.Net.Http.Primitives.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: System.Net.Http.Primitives, Version=2.1.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: All probing URLs attempted and failed.
*** Assembly Binder Log Entry (8/31/2013 @ 8:08:35 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:'Windows'Microsoft.NET'Framework64'v4.0.30319'clr.dll
Running under executable C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = NinjaWinMontage'mosheldon
LOG: DisplayName = System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Windows/System32/WindowsPowerShell/v1.0/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = powershell.exe
Calling assembly : Google.Apis, Version=1.5.0.28972, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: Using application configuration file: C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:'Windows'Microsoft.NET'Framework64'v4.0.30319'config'machine.config.
LOG: Post-policy reference: System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:'Users'mosheldon'Desktop'PSTest'PSTest'bin'Debug'System.Net.Http.Primitives.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: System.Net.Http.Primitives, Version=2.1.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: All probing URLs attempted and failed.
*** Assembly Binder Log Entry (8/31/2013 @ 8:08:35 PM) ***
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:'Windows'Microsoft.NET'Framework64'v4.0.30319'clr.dll
Running under executable C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = NinjaWinMontage'mosheldon
LOG: DisplayName = System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
(Fully-specified)
LOG: Appbase = file:///C:/Windows/System32/WindowsPowerShell/v1.0/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = powershell.exe
Calling assembly : Google.Apis, Version=1.5.0.28972, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in LoadFrom load context.
WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load().
LOG: Using application configuration file: C:'Windows'System32'WindowsPowerShell'v1.0'powershell.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:'Windows'Microsoft.NET'Framework64'v4.0.30319'config'machine.config.
LOG: Post-policy reference: System.Net.Http.Primitives, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Windows/System32/WindowsPowerShell/v1.0/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:'Users'mosheldon'Desktop'PSTest'PSTest'bin'Debug'System.Net.Http.Primitives.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: System.Net.Http.Primitives, Version=2.1.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Run-from-source setup phase failed with hr = 0x80131040.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.DLL.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives.EXE.
LOG: Attempting download of new URL file:///C:/Users/mosheldon/Desktop/PSTest/PSTest/bin/Debug/System.Net.Http.Primitives/System.Net.Http.Primitives.EXE.
LOG: All probing URLs attempted and failed.
将System.Net.Http.Primitives版本2.1.10和1.5添加到GAC
Get-GAppsUsers : Method not found: 'Void System.Net.Http.HttpClientHandler.set_
AutomaticDecompression(System.Net.DecompressionMethods)'.
解决方案
-
在GAC中注册以下内容(dll的gautil/i路径)
- System.Net.Http 2.1.10.0
- System.Net.Http.Primitives 2.1.10.0
- log4net 1.2.10.0
-
添加绑定重定向到"C:''Windows''Microsoft.NET''Framework64''v4.0.30119''config''machine.config"(替换当前运行时标记)
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.5.19.0" newVersion="2.5.19.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.1.10.0" newVersion="2.1.10.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.1.10.0" newVersion="2.1.10.0" /> </dependentAssembly> </assemblyBinding> </runtime>