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

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

TerminalServicesProfilePath
TerminalServicesHomeDirectory
TerminalServicesHomeDrive

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

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

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


person Dennis C    schedule 10.12.2008    source источник
comment
Я не уверен, нужен ли вам Windows Server, но я использую его (Server 2003). Боюсь, у меня нет под рукой XP.   -  person Arnout    schedule 10.12.2008


Ответы (3)


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

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

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

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

person chriscena    schedule 10.12.2008
comment
Я также пытался, но получил System.InvalidCastException: невозможно преобразовать COM-объект типа «System.__ComObject» в тип интерфейса «TSUSEREXLib.IADsTSUserEx». - person Dennis C; 10.12.2008
comment
Вы уверены, что DLL расширения TS ADSI зарегистрирована в системе COM через regsvr32 (совет, который я где-то позаимствовал у Джо Каплана в сети). - person chriscena; 10.12.2008
comment
Спасибо, я понял, что это работает, наконец. Мне нужно запустить regsvr32 перед запуском моего приложения. (И я забыл перезапустить свой nunit вчера) - person Dennis C; 11.12.2008

Я думаю, вы можете использовать метод 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");
    }
}
person Arnout    schedule 10.12.2008
comment
Я пробовал, и это было неудачно. System.Runtime.InteropServices.COMException : неизвестное имя. (Исключение из HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME)) - person Dennis C; 10.12.2008
comment
Для других, имеющих исключение «неизвестное имя», это связано с тем, что расширения терминального сервера не установлены. Сделать это было легко: установить средства удаленного администрирования сервера (RSAT) и активируйте их в функциях Windows ИЛИ, если у вас есть соответствующая DLL, вы можете запустить regsvr32 tsuserex.dll, как упоминалось другими. - person Ryan Horrisberger; 25.08.2011
comment
Это отлично работает для меня. Вам нужно проверить, находится ли нужная вам tsuserex.dll (x86 или x64) в нужной системной папке (c:\windows\system32 или c:\windows\syswow64), а затем запустить resvr32 из системных папок. Вы можете скопировать с другой машины, если у вас нет DLL, они должны работать. - person LPains; 03.02.2015

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

            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;
person Community    schedule 08.10.2009
comment
Любопытно, как смена интерфейса справляется со сбоем в этом примере. m_TsUser имеет значение null или возникает исключение? - person Greg Domjan; 06.05.2010