2008-12-10 17 views
2

我已閱讀來自以下廣告屬性,如何從C#中的LDAP讀取TermainsServices IADsTSUserEx屬性?

TerminalServicesProfilePath 
TerminalServicesHomeDirectory 
TerminalServicesHomeDrive 

我試過的DirectoryEntry和的DirectorySearcher。但他們不包括這些屬性。

我在vbscript和VC中找到了一些例子來讀取它們。 但是我沒能使它在C#中工作。我錯過了一些棘手的事情?

編輯︰我必須在「Windows服務器」上運行它,使其工作?可以從win XP中讀取嗎?

+0

我不知道你是否需要Windows服務器上,但是這我正在使用的是什麼(Server 2003)。恐怕我沒有XP方便。 – Arnout 2008-12-10 11:52:26

回答

1

我不記得確切,但它是這樣的:

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

那麼你可以讓你通過adsiUser希望TerminalServices屬性。

根據我的經驗,您最好在具有AD訪問權限的Windows Server上開發,因爲您使用的庫。那麼你也許會做出上述工作:)

+0

我也試過了,但是我得到了System.InvalidCastException:無法將類型爲'System .__ ComObject'的COM對象轉換爲接口類型'TSUSEREXLib.IADsTSUserEx'。 – 2008-12-10 10:38:51

+0

您確定TS ADSI擴展DLL是通過regsvr32(我從網上的Joe Kaplan找到的一個提示)在COM系統中註冊的。 – chriscena 2008-12-10 13:40:07

+0

謝謝,我終於明白了。我必須在我的應用程序啓動之前運行regsvr32。 (並且我忘記了昨天重新開始我的nunit) – 2008-12-11 04:43:57

2

我認爲你可以在你的DirectoryEntry上使用InvokeGet方法,傳入你想要讀取的屬性的名字。

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"); 
    } 
} 
1

這個工作對我來說:

  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;