Как закрыть соединение с использованием PrincipalContext для удаленного хоста? - PullRequest
0 голосов
/ 10 октября 2011

Когда я выполняю этот код,

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;
}

Ответы [ 2 ]

3 голосов
/ 10 октября 2011

Оба PrincipalContext и GroupPrincipal реализуют 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 голосов
/ 10 октября 2011

PrincipalContext является IDisposible.Вы пытались вызвать Dispose или поместить свой код в блок using?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...