0

サーバー上のユーザー アカウントを編集するためのアプリケーションを作成したいと考えています。

サーバーは 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);
}

これを試すたびに、使用するユーザーとは関係なく、ユーザーまたはパスワードが承認されていないという例外が発生します。管理者は、ビルドインの管理者ユーザー アカウントです。

PrincipalContextAD でのみ機能しますか、それともローカル アカウントでも機能しますか? 私のコードに何か問題がありますか?

4

1 に答える 1

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

コードを変更し、それを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");
}

例 2

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

上記の public bool IsValid() メソッドは、探しているものに対して機能するはずです。

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

追加の参照リンク StackOverFlow Post ContextType.Machine

于 2012-08-16T18:43:44.207 に答える