4

私は、デスク ワーカーが私の大学で機器をチェックインおよびチェックアウトするのを支援するプログラムを作成しています。Enviroment.username を使用できますが、学習経験として、現在ログインしているユーザーのフルネームを取得したいと考えています。Windows ボタンを押したときに表示されるものです。したがって、私の現在のプレイテスト コードは次のとおりです。

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
UserPrincipal user = UserPrincipal.Current;
string displayName = user.DisplayName;
Console.WriteLine(displayName);
Console.ReadLine();

しかし、プリンシパル サーバーのダウン例外が発生します。これは権限の問題だと思いますが、どこから始めればよいかさえわかりません。

これを機能させるにはどうすればよいですか?

4

2 に答える 2

2

あなたの意図が現在のユーザーのプロパティを表示することである場合...

UserPrincipal.CurrentPrincipal現在実行中のスレッドを取得します。これが意図されている場合 (例: 偽装を使用)、ユーザー データを手元に用意しておく必要があり、プリンシパル コンテキストを設定する必要はまったくありません。

var up = UserPrincipal.Current;
Console.WriteLine(user.DisplayName);

ただし、スレッドを実行しているプリンシパルが目的のユーザーではなく、ドメインからアカウント情報を収集する必要がある場合 (つまり、SLaks ポイント)、プリンシパル コンテキストをセットアップし、それを検索して適切な UserContext を取得する必要があります。 .

var pc = new PrincipalContext(ContextType.Domain, "domainName");
var user = UserPrincipal.FindByIdentity(pc, "samAccountName");
Console.WriteLine(user.DisplayName);

IdentityTypesamAccountName が気に入らない場合は、別のものを使用することもできます。

var user = UserPrincipal.FindByIdentity(pc, IdentityType.Name, "userName");
// or
var user = UserPrincipal.FindByIdentity(pc, IdentityType.Sid, "sidAsString");

最初にユーザーを手動で認証する必要がある場合は、@DJKRAZE の使用例を参照してください。principalContext.ValidateCredentials()

幸運を。

于 2012-10-31T22:35:59.877 に答える
1

このようなことを試してみることを考えましたか

bool valid = false;
using (var context = new PrincipalContext(ContextType.Domain))
{
    valid = context.ValidateCredentials(username, password);
}

さらに詳しく知りたい場合は、以下でこれを行うことができます

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);
        }
    }
}
于 2012-10-31T22:14:51.500 に答える