在Windows 2012 R2上以IIS中的CGI运行控制台应用程序。
在使用DirectoryEntry连接到Active Directory(AD)时,参考: lccDEDirectoryEntry = new DirectoryEntry(lccSDomainConnectionString,lccSUserId,lccSUserPassword,lccATAuthTypes);
然后使用DirectorySearcher,ref: lccDSSearcher = new DirectorySearcher(lccDEDirectoryEntry);
然后找到所有匹配的对象,参考: lccSRCResults = lccDSSearcher.FindAll();
然后最终访问搜索结果,参考: foreach(lccSRCResults中的SearchResult lccSRResultLoop)
一切正常,在我尝试访问搜索结果之前,它会抛出“路径中的非法字符”。
我可以在命令窗口中直接在托管IIS的服务器上运行相同的控制台应用程序,它可以正常工作,包括访问/显示SearchResults。也适用于Windows 7工作站/等。
我在一年前遇到了同样类型的问题,调用了HttpUtility,最后它成了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
这解决了一年前的空配置设置,因为当您运行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
让我的代码用虚拟值填充每个代码,但是,不要去。
有关如何找到丢失的设置键名称的任何线索?还是其他解决方案?
这是Stack Trace。底部是我的函数'lccLDAP',它通过调用SearchResults循环启动其余部分。
堆积痕迹 在System.Security.Permissions.FileIOPermission.CheckIllegalCharacters(String [] str,Boolean onlyCheckExtras) at System.Security.Permissions.FileIOPermission.AddPathList(FileIOPermissionAccess access,AccessControlActions control,String [] pathListOrig,Boolean checkForDuplicates,Boolean needFullPath,Boolean copyPathList) 在System.Security.Permissions.FileIOPermission..ctor(FileIOPermissionAccess访问,字符串路径) 在System.Reflection.RuntimeModule.get_FullyQualifiedName() 在System.Configuration.ClientConfigPaths.SetNamesAndVersion(String applicationFilename,Assembly exeAssembly,Boolean isHttp) 在System.Configuration.ClientConfigPaths..ctor(String exePath,Boolean includeUserConfig) 在System.Configuration.ClientConfigPaths.GetPaths(String exePath,Boolean includeUserConfig) 在System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord记录) at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object& result,Object& resultRuntimeObject) 在System.Configuration.BaseConfigurationRecord.GetSection(String configKey) 在System.Configuration.ConfigurationManager.GetSection(String sectionName) 在System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName) 在System.DirectoryServices.SearchResultCollection.ResultsEnumerator..ctor(SearchResultCollection结果,String parentUserName,String parentPassword,AuthenticationTypes parentAuthenticationType) 在System.DirectoryServices.SearchResultCollection.get_InnerList() 在System.DirectoryServices.SearchResultCollection.get_Item(Int32索引) at lccCoreFunctionsClass.lccLDAP(lccSettingsClass lccParamSCSettings,Int32 lccLDAPId,Int32 lccIFlag,String lccSParam)
答案 0 :(得分:0)
添加我最终做的。由于我的控制台应用程序在IIS服务器上正常运行,而不是通过IIS的Directory.SearchResults,我将程序拆分为在前端和后端模式下运行。前端服务器IIS网页,并将请求传递给后端以执行LDAP任务。然后后端服务于前端的响应。无论如何,良好的三级安全性。以防其他人寻找可能的解决方案。