2011-10-10 75 views
0

當我執行此代碼,如何使用PrincipalContext關閉連接到遠程主機?

PrincipalContext oPrincipalContext = new PrincipalContext(
    ContextType.Machine, 
    computer.Name, 
    null, 
    ContextOptions.Negotiate, 
    Settings.UserName, 
    Settings.UserPassword)) 

GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(
    oPrincipalContext, 
    Settings.AdministratorsGroup); 

連接到遠程機器被創建。我能夠看到它在cmd.exe中寫入「net use」。

但我不知道如何在關閉我的應用程序之前關閉此連接。

它會在我退出我的應用程序時自動關閉。

這裏是我的方法:

public Dictionary<Principal, ComputerPrincipal> 
GetMembersOfAdministratorsGroup(ComputerPrincipal computer) 
{ 
    var usersList = new Dictionary<Principal, ComputerPrincipal>(); 
    var tempUsersList = new Dictionary<string, Principal>(); 

    using (PrincipalContext oPrincipalContext = 
     new PrincipalContext(
      ContextType.Machine, 
      computer.Name, 
      null, 
      ContextOptions.Negotiate, 
      Settings.UserName, 
      Settings.UserPassword)) 
    { 
     using (GroupPrincipal oGroupPrincipal = 
      GroupPrincipal.FindByIdentity(
       oPrincipalContext, 
       Settings.AdministratorsGroup)) 
     { 
      if (oGroupPrincipal != null) 
      { 
       var result = oGroupPrincipal.GetMembers(); 
       foreach (Principal user in result) 
       { 
        if (!tempUsersList.ContainsKey(user.Name)) 
        { 
         tempUsersList.Add(user.Name, user); 
         usersList.Add(user, computer); 
        } 
       } 
      } 
     } 
    } 
    return usersList; 
} 
+0

做什麼用的連接是開放的問題? – mellamokb

+0

當我更改userName和UserPassword時,我無法連接到遠程計算機,因爲出現錯誤:不允許使用多個用戶名通過同一用戶與服務器或共享資源建立多個連接。斷開以前與服務器或共享資源的所有連接,然後重試。 – andDaviD

回答

0

PrincipalContext是IDisposible。您是否嘗試調用Dispose或將您的代碼放入使用塊中?

+0

我稱之爲Dispose方法。但沒有發生。 – andDaviD

3

PrincipalContextGroupPrincipal實施IDisposable。確保在使用它們之後立即處理它們(當然在嘗試再次連接之前)。這應該消除這個問題。例如。

速記: -

using(PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Machine, computer.Name, null, ContextOptions.Negotiate, Settings.UserName, Settings.UserPassword)) 
using(GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, Settings.AdministratorsGroup)) 
{ 
    // perform operations here 
} 

或速記: -

PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Machine, computer.Name, null, ContextOptions.Negotiate, Settings.UserName, Settings.UserPassword); 
try 
{ 
    GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, Settings.AdministratorsGroup); 
    try 
    { 
     // perform operations here 
    } 
    finally 
    { 
     oGroupPrincipal.Dispose(); 
    } 
} 
finally 
{ 
    oPrincipalContext.Dispose(); 
} 
+0

我已經寫了這段代碼。什麼都沒有發生( – andDaviD

+0

你是否嘗試用像我所示的塊來包裝它們? –

+0

你在oPrincipalContext和oGroupPrincipal上都稱爲Dispose? –

相關問題