我尝试使用以下代码在PowerShell中加载特定的DLL:
function New-SpecificAssembly {
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]$Path
)
process {
[string]$Fullname = ([System.Reflection.AssemblyName]::GetAssemblyName($Path)).FullName
Write-Verbose "Loading: $Fullname"
Write-Output ([System.Reflection.Assembly]::Load($FullName))
}
}
$d11_Security = New-SpecificAssembly -Path 'C:\Windows\Microsoft.NET\Framework\v1.1.4322\System.Security.dll' -Verbose
$d11_Security | ft ImageRuntimeVersion, Location -autosize
但是,我找不到一种方法来加载它的.net1.1版本的DLL。以上返回:v2.0.50727
/ C:\Windows\assembly\GAC_MSIL\System.Security\2.0.0.0__b03f5f7f11d50a3a\System.Security.dll
。
注意:我还尝试使用LoadFrom
详细信息:https://stackoverflow.com/a/9447959/361842;但是它返回了dll的v2版本。检查https://msdn.microsoft.com/en-us/library/1009fa28(v=vs.110).aspx
LoadFrom方法具有以下缺点。请考虑使用Load。
- 如果已加载具有相同标识的程序集,则即使指定了不同的路径,LoadFrom也会返回已加载的程序集。
尽管有这样的建议,但事实证明Load
有同样的警告。即每https://msdn.microsoft.com/en-us/library/ky3942xh(v=vs.110).aspx:
如果assemblyString指定完整的程序集名称,则抛出FileLoadException,并且与简单名称匹配的第一个程序集具有不同的版本,区域性或公钥标记。加载程序不会继续探测与简单名称匹配的其他程序集。
我认为LoadFile
可能在LoadFrom
失败的地方工作,因为我们明确说明了文件路径。 https://msdn.microsoft.com/en-us/library/b61s44e8(v=vs.110).aspx。遗憾的是,虽然文档没有报告任何潜在的问题(除了没有加载的依赖项),但是这仍然会返回错误的版本:
ImageRuntimeVersion Location
------------------- --------
v2.0.50727 C:\Windows\assembly\GAC_MSIL\System.Security\2.0.0.0__b03f5f7f11d50a3a\System.Security.dll
注意:由于我们正在查看x86 dll,因此我正在运行PowerShell x86(即%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe
)。
这样做的原因是为了帮助调查将遗留站点从旧的Windows 2003服务器迁移到Windows 2008 R2的问题,已经按照此处列出的步骤进行了调查:https://docs.microsoft.com/en-us/iis/install/installing-iis-7/how-to-install-aspnet-11-with-iis-on-vista-and-windows-2008。遗憾的是,我们无法访问此网站的来源,因此重新编码不是一种选择。该错误提及InvokeMember("_GetRoles", /* ... */
,因此我假设他们已使用反射技术来确定角色,如下所述:https://www.thecodingforums.com/threads/enumerate-roles-a-user-belongs-to-seek-vb-net-sample.85831/。 PowerShell只是我玩DLL的方式,以了解可能正在进行的内容/试图查看DLL是否可以正确加载/等等,即它对我来说是一种方式捅了一下。