2016-04-25 6 views
4

Я вызываю LogonUser с LOGON_TYPE_NEW_CREDENTIALS и LOGON32_PROVIDER_WINNT50, чтобы заставить мой поток олицетворять пользователя в другом домене. Я могу подключиться к удаленным общим папкам, а все остальное - в ненадежном домене.Сгенерировать отчет GPO из ненадежного домена

Проблема, с которой я столкнулся сейчас, - это когда я использую GPMGMTLib для генерации отчета GPO. Я получаю исключение «HRESULT: 0x80072020», когда он вызывает GenerateReport().

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(); 
     } 
    } 
} 
+0

Это ERROR_DS_OPERATIONS_ERROR, это очень общее и бесполезное для устранения проблемы. Попробуйте найти что-то более конкретное в журнале приложений машины. –

+0

Журнал приложений в средстве просмотра событий не дает мне ничего полезного. Если я запустил приложение и указал ему на доверенный домен, у меня нет такой же проблемы и работает нормально. – Superdumbell

ответ

1

У меня нет опыта здесь, так что это всего лишь предположение.

Рассматривая documentation for GenerateReport, последние два параметра: pvarGPMProgress (для отчетного процесса) и pvarGPMCancel (какой-то токен отмены).

Вы проходили тот же объект для обоих. Интересно, это то, что заставляет задушить. Вы можете попробовать создать второй объект.

Возможно, также возможно, что ему не нравится получать Type.Missing как значение. Вы можете просто установить для них значение null.

Кроме того, есть ли в групповой политике какие-либо специальные разрешения?

Какое пространство имен является ImpersonationContext, в котором вы используете? Я не могу найти его. У нас есть недоверенный домен на работе, с которым я могу протестировать, если я смогу скомпилировать ваш код.

Edit: Если у вас есть SetLastError = true в операторах DllImport, то вы можете использовать Marshal.GetLastWin32Error(), чтобы получить некоторые дополнительные детали. Например:

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

Для меня, он говорит мне

была сделана попытка сослаться на маркер, который не существует

Что не решить головоломку, но это еще одна часть головоломки.

+0

ImpersonationContext - это класс-оболочка для вызова LogonUser в файле advapi32.dll, который я создал, чтобы получить эту работу, которая отлично работает при подключении к сетевым ресурсам. Когда вы вызываете GenerateReport из того же домена, он работает нормально, поэтому я не думаю, что передача в Type.Missing имеет какое-то отношение к нему, не работает. Неверный домен - это еще одна настройка контроллера домена внутри нашей сети DMZ. – Superdumbell

+0

Вы могли бы опубликовать свой класс ImpersonationContext в своем вопросе? Я могу попытаться воспроизвести то, что вы здесь делаете в моей среде, и посмотреть, получаю ли я те же результаты. –

+0

Nevermind. Я использовал реализацию из [здесь] (http://stackoverflow.com/questions/2808928/how-to-impersonate-a-user-in-managed-code), и я получаю ту же ошибку 0x80072020, что и вы. Я посмотрю, смогу ли я это понять. –

Смежные вопросы