winforms 尝试使用工作组服务器上的PrincipalContext进行连接时返回无效用户,

yrefmtwq  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(128)

我想创建一个应用程序以编辑服务器上的用户帐户。
服务器不使用仅限AD的本地帐户。
我使用以下代码连接远程服务器:

try
{
    PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Machine, "192.168.123.110", null, ContextOptions.Negotiate, "Administrator", "password");
    try
    {
        MessageBox.Show(oPrincipalContext.ConnectedServer);
        GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, "Goetter");
        try
        {
            // perform operations here
        }
        finally
        {
            oGroupPrincipal.Dispose();
        }
    }
    finally
    {
        oPrincipalContext.Dispose();
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

每当我尝试这样做的时候,我都会得到一个异常,即用户和/或密码没有被授权,与我使用的用户无关。
PrincipalContext只适用于AD还是本地帐户?我的代码有什么问题吗?

ss2ws0br

ss2ws0br1#

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
}

更改代码并将其 Package 在using语句周围,否则在尝试调用Dispose()方法时可能会出现一些错误,原因是在尝试释放连接时,连接可能已经关闭。
如果您使用ActiveDirectory,则可以在此处使用此代码并尝试其中一个示例
实施例1:
如果您使用的是.NET 3.5,则可以使用System.DirectoryServices.AccountManagement命名空间并轻松地验证您的凭据:

// create a "principal context" - e.g. your domain (could be machine, too)
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
    // validate the credentials
    bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}

实施例二

using System.Security;
using System.DirectoryServices.AccountManagement;

public struct Credentials
{
    public string Username;
    public string Password;
}

public class Domain_Authentication
{
    public Credentials Credentials;
    public string Domain;

    public Domain_Authentication(string Username, string Password, string SDomain)
    {
        Credentials.Username = Username;
        Credentials.Password = Password;
        Domain = SDomain;
    }

    public bool IsValid()
    {
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
        {
            // validate the credentials
            return pc.ValidateCredentials(Credentials.Username, Credentials.Password);
        }
    }
}

上面的公共bool IsValid()方法应该可以满足您的要求。
Have a look at PrincipalContext.ValidateCredentials
对于FindByIdentity部分,可以尝试以下替换代码

string strName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 
// This is here because of a .Net error that gets 0x80005000 on "isUser = user.IsMemberOf(groupU);"
string domainName = strName.Split('\\')[0]; 
var pc = new PrincipalContext(ContextType.Domain, domainName);

ContextType.Machine后附加参考链路堆栈溢出

相关问题