我的结论是,这些问题与
System.ServiceModel
在里面净额4.0。
起初,我认为这可能与Server 2016 UAC或有关。NET 4.0/IIS 10 web应用程序运行时设置(例如,NET 2.0与NET 4.0 CAS机型)。我在中创建了一个简单的web应用程序。NET 3.5并尝试调用
Process.GetCurrentProcess().Handle
。我在新服务器上运行了此操作,但失败了,出现了相同的“拒绝访问”错误。
我把它放到旧服务器(Windows server 2008 R2,.NET 3.5)中,并在那里运行,希望它能正常工作,瞧,它也失败了。所以我浏览了
系统服务模型
在3.5中发现
AppContainerInfo
因此,3.5代码可能根本不会进行相同的Win32 API级别调用。
我的结论是,我们以前没有遇到过这个错误,因为旧的3.0库不需要从调用API
advapi32.dll
或者使用其他机制来创建管道名称。
实际上,以下是
PipeConnectionInitiator.GetPipeName
在3.0中:
internal static string GetPipeName(Uri uri)
{
string[] strArray = new string[3]
{
"+",
uri.Host,
"*"
};
bool[] flagArray = new bool[2]{ true, false };
for (int index1 = 0; index1 < strArray.Length; ++index1)
{
for (int index2 = 0; index2 < flagArray.Length; ++index2)
{
下面是4.0中的前几行:
internal static string GetPipeName(Uri uri, IPipeTransportFactorySettings transportFactorySettings)
{
AppContainerInfo appContainerInfo = PipeConnectionInitiator.GetAppContainerInfo(transportFactorySettings);
string[] strArray = new string[3]
{
"+",
uri.Host,
"*"
};
bool[] flagArray = new bool[2]{ true, false };
string str1 = string.Empty;
string str2 = (string) null;
for (int index1 = 0; index1 < strArray.Length; ++index1)
{
for (int index2 = 0; index2 < flagArray.Length; ++index2)
{
if (appContainerInfo == null || !flagArray[index2])
因此,4.0实现需要访问才能执行
OpenProcessToken
。
如果代码被充分隔离,一种选择是使用程序集绑定重定向:
<runtime>
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity name="System.ServiceProcess" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="4.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
并简单地强制运行时绑定到旧版本。
不幸的是,应用程序对
系统服务模型
4.0所以切换对我来说并不那么简单。