在Windows 2012 R2上的IIS中作为CGI运行控制台应用程序。
在连接到Active Directory(AD)时,使用DirectoryEntry,ref:lccDEDirectoryEntry=new DirectoryEntry(lccSDomainConnectionString,lccSUserId,lccSUserPassword,lccATAuthTypes);
然后使用DirectorySearcher,ref:lccDSSearcher=new DirectorySearcher(lccDEDirectoryEntry);
然后查找所有匹配的对象,ref:lccSRCResults=lccdssearcher.findAll();
然后最后访问搜索结果,ref:foreach(SearchResult lccSRResultLoop in lccSRCResults)
所有工作良好,直到我尝试访问搜索结果,它抛出一个“非法字符在路径”。
我可以在命令窗口中直接在承载IIS的服务器上运行相同的控制台应用程序,并且它工作良好,包括访问/显示搜索结果。在Windows7工作站等上也能很好地工作。
一年前,我通过调用HttpUtility遇到了同样的类型问题,它最终成为IIS中的一个bug,在IIS中,它查找的配置设置为null。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
这在一年前就解决了null配置设置,因为当您运行HttpUtility时,IIS会查找作为控制台应用程序运行时未设置且未使用的“APP_CONFIG_FILE”设置。
嗯,我的调试/等等。已经显示出了相同的问题,即设置为null,因此函数“checkillegalcharacters”没有崩溃,因为它无法解析null值。
不幸的是,我找不到它正在寻找的设置。我甚至枚举了所有AppSetting键,ref:https://msdn.microsoft.com/en-us/library/system.AppDomain.GetData%28v=vs.110%29.aspx?f=255&mspperror=-2147217396
并让我的代码用一个虚拟值填充每一个,但是,没有。
关于如何找到丢失的设置键名称有什么线索吗?还是其他解决方案?
这里是堆栈跟踪。底部是函数'lcc ldap',它通过调用SearchResults循环来启动其余部分。
在System.Security.Permissions.FileOpermission.CheckillegalCharacters(String[]str,Boolean onlyCheckExtras)中的堆栈跟踪,在System.Security.Permissions.FileOpermission.AddPathList(FileOpermissionAccess access,AccessControlActions control,String[]pathListOrig,Boolean checkForDuplicates,Boolean needFullPath,Boolean copyPathList)中的堆栈跟踪,在getLkg,布尔checkPermission,布尔getRuntimeObject,布尔requestIsHere,Object&;结果,对象(&S;System.Configuration.BaseConfigurationRecord.GetSection(String configKey)中的resultRuntimeObject),System.Configuration.ConfigurationManager.GetSection(String sectionName)中的System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName)中的System.DirectoryServices.SearchResultCollection.ResultSenumerator.。CTor(SearchResultCollection结果,String parentUserName,String parentPassword,
加上我最后做的事。由于我的控制台应用程序在IIS服务器上运行良好,只是不是通过IIS for Directory.SearchResults,所以我将程序拆分为前端和后端模式运行。前端服务器IIS网页,并将请求传递给LDAP任务的后端。然后,后端向前端提供响应。好的三级安全。以防万一其他人寻找可能的解决方案。