C# 从不受信任的域生成GPO报告

C# 从不受信任的域生成GPO报告,c#,.net,active-directory,C#,.net,Active Directory,我正在使用LOGON\u TYPE\u NEW\u凭据和LOGON32\u PROVIDER\u WINNT50调用LogonUser,以使我的线程模拟另一个域中的用户。我能够连接到远程文件共享和其他所有内容,并将其放入不受信任的域中 我现在遇到的问题是,当我使用GPMGMTLib生成GPO报告时,当它调用GenerateReport()时,我不断收到异常“HRESULT:0x80072020” 我在这里没有经验,所以这只是一个猜测 查看,最后两个参数是pvarGPMProgress(用于报告进

我正在使用LOGON\u TYPE\u NEW\u凭据和LOGON32\u PROVIDER\u WINNT50调用LogonUser,以使我的线程模拟另一个域中的用户。我能够连接到远程文件共享和其他所有内容,并将其放入不受信任的域中

我现在遇到的问题是,当我使用GPMGMTLib生成GPO报告时,当它调用GenerateReport()时,我不断收到异常“HRESULT:0x80072020”


我在这里没有经验,所以这只是一个猜测

查看,最后两个参数是
pvarGPMProgress
(用于报告进度)和
pvarGPMCancel
(某种取消令牌)

您正在为这两个对象传递相同的对象。我不知道这是不是让它窒息的原因。可以尝试创建第二个对象

也可能它不喜欢获取Type.Missing作为值。您可以尝试将它们设置为null

此外,组策略是否对其具有任何特殊权限

您正在使用的
ImpersonationContext
是什么名称空间?我找不到它。我们确实有一个不受信任的域在工作,我可以测试,如果我可以让你的代码编译

编辑: 如果DllImport语句中有
SetLastError=true
,则可以使用
Marshal.GetLastWin32Error()
获取一些其他详细信息。例如:

try {
    result = gpo.GenerateReport(GPMReportType.repHTML, ref missing, out missing).Result;
} catch {
    var win32 = new Win32Exception(Marshal.GetLastWin32Error());
    Console.Write(win32.Message);
}
对我来说,它告诉我

试图引用不存在的令牌


这并不能解决难题,但它是难题的另一部分。

这是错误\u DS\u操作\u错误,解决问题非常普遍,没有用。尝试在计算机的应用程序日志中查找更具体的内容。事件查看器中的应用程序日志没有提供任何有用的信息。如果我运行应用程序并将其指向一个受信任的域,我不会遇到同样的问题,并且运行良好。ImpersonationContext是一个包装类,用于调用advapi32.dll中的LogonUser,我构建该包装类是为了使其工作,在连接到网络共享时工作正常。当从同一个域中调用GenerateReport时,它可以正常工作,因此我不认为传入Type.Missing与它不工作有任何关系。不受信任的域是我们DMZ网络中的另一个域控制器设置。您能否在问题中发布您的ImpersonationContext类?我可以试着在我的环境中复制你在这里做的事情,看看是否得到同样的结果。我使用了来自的实现,得到了与您相同的0x80072020错误。我会看看我是否能找到答案。我已经在我的答案中添加了一些更新的细节,但还没有解决方案。所以我被难住了。我做不到。有趣的是,组策略管理MMC插件根本不允许您访问不受信任的域。所以也许图书馆不支持它。
try {
    result = gpo.GenerateReport(GPMReportType.repHTML, ref missing, out missing).Result;
} catch {
    var win32 = new Win32Exception(Marshal.GetLastWin32Error());
    Console.Write(win32.Message);
}