0

私は、Active Directory を含むプロジェクトで System.DirectoryServices をしばらく使用してきました。特定のアカウントの属性を制御する UserAccountControl プロパティの実装に興味があります。x または y 設定の状態を判断するためにバイトの組み合わせを使用して自分のアプリケーションに設定を実装したい場合、C# でこれを行うにはどうすればよいでしょうか? 自分のクラスに useraccountcontrol プロパティを実装し、バイトの組み合わせを使用してアカウントに必要なアクセス許可を決定したいとします。

Active Directory での変更方法は次のとおりです: http://support.microsoft.com/kb/305144

ここにオブジェクト定義のある場所があります: http://msdn.microsoft.com/en-us/library/ms680832%28VS.85%29.aspx

編集:

独自の User クラスがあり、Active Directory で UserAccountControl を実装するのと同様の方法でプロパティを実装したいとします。設定を保存する 4 バイトのセットが必要だとしましょう。

最後のバイトを使用して、アカウントのステータスを判断したいと考えています。

次に、左側の次のバイトにアカウントの種類を含めたい: 16=管理者アカウント、32=通常のアカウント、64=ゲスト アカウント、128=その他のアカウント。

次に、左側の次のバイトを使用して、256 = 何か、512 = 何か他のもの、1024 = 何か他のものなどのように、他の設定を設定します。

これを組み合わせて、ビットごとの組み合わせを使用してアカウントのプロパティを設定したいと思います。アイデアは頭の中にありますが、それを実装する方法がわかりません。また、自分がやろうとしていることを理解できるかどうかさえわかりません。

編集:答えを受け取ってさらに掘り下げた後、フラグの設定について詳しく説明しているこのリンクを見つけました:http://msdn.microsoft.com/en-us/library/ms229062.aspx

4

1 に答える 1

1

ヘルパー型を定義しましょう:

[Flags]
public enum UserAccountControl {
    // values from http://support.microsoft.com/kb/305144
    Script = 0x0001,
    AccountDisabled = 0x0002,
    HomeDirRequired = 0x0008,
    Lockout = 0x0010,
    PasswordNotRequired = 0x0020,
    PasswordCantChange = 0x0040,
    EncryptedTextPasswordAllowed = 0x0080,
    TempDuplicateAccount = 0x0100,
    NormalAccount = 0x0200,
    InterDomainTrustAccount = 0x0800,
    WorkstationTrustAccount = 0x1000,
    ServerTrustAccount = 0x2000,
    DontExpirePassword = 0x10000,
    MnsLogonAccount = 0x20000,
    SmartcardRequired = 0x40000,
    TrustedForDelegation = 0x80000,
    Delegated = 0x100000,
    UseDesKeyOnly = 0x200000,
    DontReqPreauth = 0x400000,
    PasswordExpired = 0x800000,
    TrustedToAuthForDelegation = 0x1000000
}

intとタイプの間でキャストできenumます (これらの値のいずれかを整数として取得する方法を知っていると仮定しています)。次に、次のようにビット単位の演算子を使用して値を操作できます。

void manipulateUserFlags(UserAccountControl uac) {
    // Set the SCRIPT flag (bitwise OR)
    uac |= UserAccountControl.Script;

    // Clear the ACCOUNTDISABLE flag (complement, bitwise AND)
    uac &= ~UserAccountControl.AccountDisabled;

    // Check for the HOMEDIR_REQUIRED flag (bitwise AND)
    if((uac & UserAccountControl.HomeDirRequired) != UserAccountControl.None) {
        // ...
    }

    // Toggle the NORMAL_ACCOUNT flag (bitwise XOR)
    uac ^= UserAccountControl.NormalAccount;

    // Check for several types of trust, and a required password
    if((uac & UserAccountControl.WorkstationTrustAccount
            & UserAccountControl.ServerTrustAccount
            & ~UserAccountControl.PasswordNotRequired) != UserAccountControl.None) {
        // ...
    }
}

これらは整数に対して機能するビット単位の演算子と同じですが、enumより厳密に型指定されているため、C# では型を使用することをお勧めします。C や C++ では、整数のビット単位の操作がはるかに理にかなっています。これは、条件分岐で整数を直接テストでき、これらの言語は厳密に型指定されていないためです。

enumただし、これをライブラリの一部として実装する場合、またはこれらの操作を一般的に行う場合は、同様の設定のグループを表すいくつかのベースのプロパティint ToADValueUserAccountControl FromADValueメソッドを使用して、より多くの設計を配置することを検討します。これにより、検証ロジックを配置する場所が明確になり、これらのプロパティを操作するコードがさらに読みやすくなります。

于 2010-11-02T23:33:30.560 に答える