2011-10-10 1 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を呼び出したり、コードをusingブロックに入れたりしてみましたか?

+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を呼び出しましたか? –

関連する問題