C# 如何使用PrincipalContext关闭与远程主机的连接?

C# 如何使用PrincipalContext关闭与远程主机的连接?,c#,active-directory,connection,C#,Active Directory,Connection,当我执行这个代码时 PrincipalContext oPrincipalContext = new PrincipalContext( ContextType.Machine, computer.Name, null, ContextOptions.Negotiate, Settings.UserName, Settings.UserPassword)) GroupPrincipal oGroupPrincipal = GroupPrin

当我执行这个代码时

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;
}
公共词典
GetMembersOfAdministratorsGroup(计算机主体计算机)
{
var usersList=new Dictionary();
var tempUsersList=新字典();
使用(PrincipalContext oPrincipalContext=
新主语境(
ContextType.Machine,
计算机名,
无效的
上下文选项。协商,
Settings.UserName,
设置(用户密码)
{
使用(GroupPrincipal)和(GroupPrincipal)=
GroupPrincipal.FindByIdentity(
在适当的情况下,
设置(管理员组)
{
if(oGroupPrincipal!=null)
{
var result=oGroupPrincipal.GetMembers();
foreach(结果中的主要用户)
{
如果(!tempUsersList.ContainsKey(user.Name))
{
tempUsersList.Add(user.Name,user);
添加(用户,计算机);
}
}
}
}
}
返回用户列表;
}

可以使用PrincipalContext。您是否尝试调用Dispose或将代码放入using块?

PrincipalContext是IDispoble。您是否尝试调用Dispose或将代码放入using块?

既有
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();
}

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

打开连接有什么问题?当我更改用户名和用户密码时,我无法连接到远程计算机,因为我有一个错误:不允许同一用户使用多个用户名多次连接到服务器或共享资源。断开以前与服务器或共享资源的所有连接,然后重试。打开连接有什么问题?当我更改用户名和用户密码时,我无法连接到远程计算机,因为我有一个错误:同一用户使用多个用户名多次连接到服务器或共享资源,这是不允许的。断开以前与服务器或共享资源的所有连接,然后重试。我调用了Dispose方法。但什么也没发生。我调用了Dispose方法。但是什么也没发生。您对oPrincipalContext和oGroupPrincipal都调用了Dispose?您确定在代码的其他地方没有类似的地方吗?如果您确保在处理完所有处置对象后立即对其进行处置,则不应该看到此问题。当然,除非PrincipalContext和GroupPrincipal的实现有缺陷,但我想快速的谷歌搜索可以证明或反驳这一点。错误发生在我代码的第二个字符串中。但我确信我忘记了处理某些内容,因为当我退出应用程序时,所有连接都已关闭。您在oPrincipalContext和oGroupPrincipal上都调用了dispose?您确定代码中没有其他地方在执行类似操作吗?如果您确保在处理完所有处置对象后立即对其进行处置,则不应该看到此问题。当然,除非PrincipalContext和GroupPrincipal的实现有缺陷,但我想快速的谷歌搜索可以证明或反驳这一点。错误发生在我代码的第二个字符串中。但我肯定我忘了处理一些东西,因为当我退出应用程序时,所有连接都关闭了。