【发布时间】:2017-10-06 22:50:47
【问题描述】:
在 Windows 2012 R2 上的 IIS 中将控制台应用程序作为 CGI 运行。
在连接到 Active Directory (AD) 时,使用 DirectoryEntry,参考: lccDEDirectoryEntry = new DirectoryEntry(lccSDomainConnectionString, lccSUserId, lccSUserPassword, lccATAuthTypes);
然后使用 DirectorySearcher,参考: lccDSSearcher = new DirectorySearcher(lccDEDirectoryEntry);
然后找到所有匹配的对象,参考: lccSRCResults = lccDSSearcher.FindAll();
然后最后访问搜索结果,参考: foreach (在 lccSRCResults 中搜索结果 lccSRResultLoop)
一切正常,直到我尝试访问搜索结果,它会抛出“路径中的非法字符”。
我可以在命令窗口中直接在托管 IIS 的服务器上运行相同的控制台应用程序,它工作正常,包括访问/显示 SearchResults。也适用于 Windows 7 工作站/等。
我在一年前调用 HttpUtility 时遇到了同样类型的问题,它最终成为 IIS 中的一个错误,它正在寻找一个为空的配置设置。 Microsoft 提供了使用此行的修复程序: AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", Environment.CurrentDirectory + "\" + System.AppDomain.CurrentDomain.FriendlyName + ".config");
根据此博客页面: http://www.dreamincode.net/forums/topic/300197-webrequest-in-a-cgi
这解决了一年前的空配置设置,因为当您运行 HttpUtility 时,IIS 会查找作为控制台应用程序运行时未设置且未使用的“APP_CONFIG_FILE”设置。
好吧,我的调试/等等。表明遇到了同样的问题,即设置为空,因此“CheckIllegalCharacters”函数不会崩溃,因为它无法解析空值。
很遗憾,我找不到它要查找的设置。我什至枚举了所有 AppSetting 键,参考: https://msdn.microsoft.com/en-us/library/system.appdomain.getdata%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
让我的代码用一个虚拟值填充每一个,但是,不行。
关于如何找到丢失的设置键名称的任何线索?还是其他解决方案?
这是堆栈跟踪。底部是我的函数“lccLDAP”,它通过调用 SearchResults 循环来启动其余部分。
堆栈跟踪 在 System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String[] str, Boolean onlyCheckExtras) 在 System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess 访问,AccessControlActions 控件,String[] pathListOrig,布尔 checkForDuplicates,布尔 needFullPath,布尔 copyPathList) 在 System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess 访问,字符串路径) 在 System.Reflection.RuntimeModule.get_FullyQualifiedName() 在 System.Configuration.ClientConfigPaths.SetNamesAndVersion(字符串应用程序文件名,程序集 exeAssembly,布尔 isHttp) 在 System.Configuration.ClientConfigPaths..ctor(字符串 exePath,布尔值 includeUserConfig) 在 System.Configuration.ClientConfigPaths.GetPaths(字符串 exePath,布尔值 includeUserConfig) 在 System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord 记录) 在 System.Configuration.BaseConfigurationRecord.GetSectionRecursive(字符串 configKey,布尔 getLkg,布尔 checkPermission,布尔 getRuntimeObject,布尔 requestIsHere,对象和结果,对象和 resultRuntimeObject) 在 System.Configuration.BaseConfigurationRecord.GetSection(字符串 configKey) 在 System.Configuration.ConfigurationManager.GetSection(字符串 sectionName) 在 System.Configuration.PrivilegedConfigurationManager.GetSection(字符串 sectionName) 在 System.DirectoryServices.SearchResultCollection.ResultsEnumerator..ctor(SearchResultCollection 结果,字符串 parentUserName,字符串 parentPassword,AuthenticationTypes parentAuthenticationType) 在 System.DirectoryServices.SearchResultCollection.get_InnerList() 在 System.DirectoryServices.SearchResultCollection.get_Item(Int32 索引) 在 lccCoreFunctionsClass.lccLDAP(lccSettingsClass lccParamSCSettings, Int32 lccLDAPId, Int32 lccIFlag, String lccSParam)
【问题讨论】:
-
您可以尝试使用反射器调试内部 ms .net 代码,例如。 G。点窥。适用于控制台应用程序,也应适用于 iis
-
感谢您的建议。由于 IIS 在单个服务 (dll) 中运行,并且会启动内部应用程序池,您如何将反射器附加到在单个 IIS 服务的应用程序池中启动的特定控制台应用程序?
-
我不熟悉 IIS,但据我了解,当您在浏览器中点击链接时,IIS 会运行您的进程。因此,您应该在进程树中找到它,并且当然可以使用 Visual Studio 和 thread.sleep 附加到它。 Reflector 用作符号服务器。当进程加载此 dll 时,它会为内部 .net 库创建 pdb 文件。最后,pdb 将被加载到 Visual Studio 中,这样您就可以在调试期间单步执行 ms 代码
-
感谢您提供详细信息。我已经在服务器 Reflector 上安装了 VS 2015,我现在正在查看结果。不幸的是(请参阅上面原始的堆栈跟踪),正在轰炸的函数(checkIllegalCharacters)不是问题。它从 AppPathList 获取空值,从 ctor 获取空值,这些都是 Microsoft 函数,因此不提供 PDB 符号。我基本上需要找出正在寻找的配置键名是空的,但是,该键名在一个函数中的多个调用中,然后再被轰炸。
-
是的,似乎有问题的方法是 InternalGetFullyQualifiedName。我相信,路径不为空,因为会抛出 NullReferenceException,如果我理解正确,您会收到 ArgumentException。正如我所见,COMModule::GetFullyQualifiedName 在后台被调用(github.com/dotnet/coreclr/blob/master/src/vm/commodule.cpp)。所以是时候更深入了
标签: c# iis active-directory console ldap