Как прочитать свойство IADsTSUserEx TermainsServices из LDAP в C #?

Я прочитал следующие свойства из AD,

TerminalServicesProfilePath
TerminalServicesHomeDirectory
TerminalServicesHomeDrive

Я пробовал DirectoryEntry и DirectorySearcher. Но они не включают в себя свойства.

Я нашел несколько примеров в VBScript и VC, чтобы прочитать их. Однако мне не удалось заставить его работать в C #. Я скучаю по какой-то хитрой вещице?

РЕДАКТИРОВАТЬ: я должен запустить его на «Windows Server», чтобы он работал? Это можно прочитать из win XP?

10.12.2008 09:19:22
Я не уверен, нужен ли вам Windows Server, но это то, что я использую (Server 2003). Боюсь, у меня нет под рукой XP.
Arnout 10.12.2008 11:52:26
3 ОТВЕТА
РЕШЕНИЕ

Я точно не помню, но это примерно так:

//user is a DirectoryEntry
IADsTSUserEx adsiUser = (IADsTSUserEx)user.NativeObject; 

затем вы можете получить нужные вам свойства TerminalServices через adsiUser.

Исходя из моего опыта, вам лучше разрабатывать на Windows Server с доступом к AD из-за используемых вами библиотек. Тогда вы, вероятно, тоже сделаете вышеописанную работу :)

1
10.12.2008 14:14:23
Я также пытался, но получил System.InvalidCastException: Невозможно привести объект COM типа 'System .__ ComObject' к типу интерфейса 'TSUSEREXLib.IADsTSUserEx'.
Dennis C 10.12.2008 10:38:51
Вы уверены, что DLL-библиотека расширения TS ADSI зарегистрирована в системе COM через regsvr32 (совет, который я где-то взял у Джо Каплана в сети).
chriscena 10.12.2008 13:40:07
Спасибо, я понял, это работает наконец. Я должен запустить regsvr32 до запуска моего приложения. (И я забыл перезапустить мою монашку вчера)
Dennis C 11.12.2008 04:43:57

Я думаю, что вы можете использовать InvokeGetметод DirectoryEntry, передавая имя свойства, которое вы хотите прочитать.

2008-12-10 11:50 CET - отредактировано в ответ на комментарий

Если указать имя свойства мусора, я получу то же исключение COM. Вы уверены, что свойства, которые вы пытаетесь получить, являются частью схемы AD?

Просто чтобы убедиться, код, который я использую, выглядит следующим образом:

using (DirectorySearcher searcher = new DirectorySearcher("(cn=Test)"))
{
    SearchResult result = searcher.FindOne();
    if (result != null)
    {
        DirectoryEntry entry = result.GetDirectoryEntry();
        string s = entry.InvokeGet("TerminalServicesHomeDrive") as string;
        MessageBox.Show(s ?? "null");
    }
}
2
10.12.2008 10:56:56
Я попробовал это, и это не удалось. System.Runtime.InteropServices.COMException: Неизвестное имя. (Исключение из HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))
Dennis C 10.12.2008 10:05:57
Для других, имеющих исключение «неизвестное имя» - это потому, что расширения сервера терминалов не установлены. Это было легко сделать, это установить средства удаленного администрирования сервера (RSAT) и активировать их в функциях Windows ИЛИ, если у вас есть соответствующая DLL, вы можете запустить «regsvr32 tsuserex.dll», как упоминалось другими.
Ryan Horrisberger 25.08.2011 15:32:37
Это прекрасно работает для меня. Вам нужно проверить, находится ли нужный файл tsuserex.dll (x86 или x64) в нужной системной папке (c: \ windows \ system32 или c: \ windows \ syswow64), а затем запустить resvr32 из системных папок. Вы можете скопировать с другого компьютера, если у вас нет DLL, они должны работать.
LPains 3.02.2015 16:38:08

Это работает для меня:

            DirectoryEntry user = new DirectoryEntry("LDAP://" + sLDAP_SERVER + "/cn=" + SAMAccount + "," + sLdapFullPath, sUser, sPwd);

            //ActiveDs.IADsUser iADsUser = (ActiveDs.IADsUser)user.NativeObject;
            ActiveDs.IADsUser cont = null;

            cont = user.NativeObject as ActiveDs.IADsUser;

            TSUSEREXLib.IADsTSUserEx m_TsUser = (TSUSEREXLib.IADsTSUserEx)cont;
            int m_TSLogonDisabled = 0;

            m_TsUser.AllowLogon = m_TSLogonDisabled;
1
8.10.2009 16:12:36
Любопытно, как смена интерфейса обрабатывает сбой в этом примере. для m_TsUser установлено значение null или возникает исключение?
Greg Domjan 5.05.2010 21:48:36