【问题标题】:Generate GPO Report From Untrusted Domain从不受信任的域生成 GPO 报告
【发布时间】:2016-04-25 16:06:45
【问题描述】:

我正在使用 LOGON_TYPE_NEW_CREDENTIALS 和 LOGON32_PROVIDER_WINNT50 调用 LogonUser,以让我的线程模拟另一个域中的用户。我能够连接到远程文件共享和其他一切都可以进入不受信任的域。

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

using GPMGMTLib;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace CrossDomainWork
{
    class Program
    {
        static void Main(string[] args)
        {
            ImpersonationContext context = new ImpersonationContext("ourdmzdomain.com", "dmzuser", "dmzpassword");
            context.Start();

            GPM gpm = new GPM();
            var constants = gpm.GetConstants();
            var domain = gpm.GetDomain("ourdmzdomain.com", "", constants.UseAnyDC);
            var gpo = domain.GetGPO("{31B2F340-016D-11D2-945F-00C04FB984F9}");
            object missing = Type.Missing;
            var result = gpo.GenerateReport(GPMReportType.repHTML, ref missing, out missing).Result;

            context.Stop();
        }
    }
}

【问题讨论】:

  • 那是ERROR_DS_OPERATIONS_ERROR,非常通用,排查问题没用。尝试在机器的应用程序日志中找到更具体的内容。
  • 事件查看器中的应用程序日志没有给我任何有用的信息。如果我运行该应用程序并让它指向一个受信任的域,我就没有同样的问题并且运行良好。

标签: c# .net active-directory


【解决方案1】:

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

查看documentation for GenerateReport,最后两个参数是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);
}

对我来说,它告诉我

试图引用不存在的令牌

这并不能解决难题,但它是另一个难题。

【讨论】:

  • ImpersonationContext 是一个包装类,用于在 advapi32.dll 中调用 LogonUser,我构建它是为了使其在连接到网络共享时正常工作。当从同一个域中调用 GenerateReport 它工作正常,所以我不认为传入 Type.Missing 与它不起作用有任何关系。不受信任的域是我们 DMZ 网络内的另一个域控制器设置。
  • 你能在你的问题中发布你的 ImpersonationContext 类吗?我可以尝试在我的环境中复制您在此处所做的事情,看看是否得到相同的结果。
  • 没关系。我使用了 here 的实现,我得到了和你一样的 0x80072020 错误。我看看能不能解决。
  • 我在回答中添加了一些更新的细节,但还没有解决方案。
  • 所以我很难过。我不能让它去。有趣的是,组策略管理 MMC 插件根本不允许您访问不受信任的域。所以也许图书馆只是不支持它。
猜你喜欢
  • 2023-03-21
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多