gpt4 book ai didi

.net - C# 通过模拟访问 DirectoryEntry 只会在第一次抛出灾难性异常

转载 作者:行者123 更新时间:2023-12-01 02:26:23 26 4
gpt4 key购买 nike

我正在使用此 c# 代码模拟用户:

    SafeTokenHandle logon_token = null;
SafeTokenHandle duplicate_token = null;

const int LOGON32_PROVIDER_DEFAULT = 0;

const int LOGON32_LOGON_INTERACTIVE = 2;

const int SecurityImpersonation = 2;


if (!LogonUser(m_Username, m_Domain, m_Password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,out logon_token))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}

using (logon_token)
{

if (!DuplicateToken(logon_token, SecurityImpersonation, out duplicate_token))
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}

using (duplicate_token)
{
using (WindowsIdentity new_id = new WindowsIdentity(logon_token.DangerousGetHandle()))
{

using (WindowsImpersonationContext impersonatedUser = new_id.Impersonate())
{
return invocation_delegate(param);
}
}
}
}

其中 invocation_delegate 将调用将使用 DirectoryEntry(使用 Secure AuthenticationType)访问 Active Directory 对象的方法。

我的问题是,我第一次调用 DirectoryEntry 功能时,会引发以下异常:
Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))
at System.Security.Policy.PEFileEvidenceFactory.GetLocationEvidence(SafePEFileHandle peFile, SecurityZone& zone, StringHandleOnStack retUrl)
at System.Security.Policy.PEFileEvidenceFactory.GenerateLocationEvidence()
at System.Security.Policy.PEFileEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.AssemblyEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate)
at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
at System.Security.Policy.Evidence.GetHostEvidence(Type type, Boolean markDelayEvaluatedEvidenceUsed)
at System.Security.Policy.AppDomainEvidenceFactory.GenerateEvidence(Type evidenceType)
at System.Security.Policy.Evidence.GenerateHostEvidence(Type type, Boolean hostCanGenerate)
at System.Security.Policy.Evidence.GetHostEvidenceNoLock(Type type)
at System.Security.Policy.Evidence.RawEvidenceEnumerator.MoveNext()
at System.Security.Policy.Evidence.EvidenceEnumerator.MoveNext()
at System.Configuration.ClientConfigPaths.GetEvidenceInfo(AppDomain appDomain, String exePath, String& typeName)
at System.Configuration.ClientConfigPaths.GetTypeAndHashSuffix(AppDomain appDomain, String exePath)
at System.Configuration.ClientConfigPaths..ctor(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigPaths.GetPaths(String exePath, Boolean includeUserConfig)
at System.Configuration.ClientConfigurationHost.RequireCompleteInit(IInternalConfigRecord record)
at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject)
at System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
at System.Configuration.ClientConfigurationSystem.System.Configuration.Internal.IInternalConfigSystem.GetSection(String sectionName)
at System.Configuration.ConfigurationManager.GetSection(String sectionName)
at System.Configuration.PrivilegedConfigurationManager.GetSection(String sectionName)
at System.DirectoryServices.SearchResultCollection.ResultsEnumerator..ctor(SearchResultCollection results, String parentUserName, String parentPassword, AuthenticationTypes parentAuthenticationType)
at System.DirectoryServices.SearchResultCollection.GetEnumerator()
at System.DirectoryServices.DirectorySearcher.FindOne()
at Utilities.ADUtilities.GetEnrollmentServiceByNameAndDNSName(String name, String dns_name)

如果我然后使用相同的模拟上下文访问 DirectoryEntry 函数或使用不同的模拟上下文(撤消模拟并再次模拟),则不会抛出异常。

最佳答案

我想我发现了问题。我的 C# 项目中有一个 CLI/C++ DLL 作为引用。如果我在程序开始时通过 Assembly.LoadFile 加载 DLL,那么问题就不会发生。另一方面,如果我让系统在它认为合适的时候加载它(系统似乎只有在对 DLL 的实际调用完成时才加载它),就会发生异常。

我以与使用 DirectoryEntry 函数相同的方法调用此 DLL 的方法。

例如。:

void Method1()
{
DirectoryEntry de = //....
de. //....
CLICPPLibrary.DoStuff();
}

无论如何,我认为这仍然是一个需要解决的问题。即使稍后加载DLL,也不应该有异常(exception)。或者至少在调用 DirectoryEntry 方法时不能发生异常。

关于.net - C# 通过模拟访问 DirectoryEntry 只会在第一次抛出灾难性异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16057855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com