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

时间:2016-04-25 16:06:45

标签: c# .net active-directory

我正在使用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();
        }
    }
}

1 个答案:

答案 0 :(得分: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);
}

对我而言,它告诉我

  

尝试引用不存在的令牌

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