1

グループの groupType プロパティのSECURITY_ENABLEDフラグを読み取ろうとしています。問題は、使用して取得した値が

DirectoryEntry entry...
entry.Properties["groupType"].Value;

int32範囲は-2,147,483,647 ~ 2,147,483,648 (または -0x7FFFFFFF ~ 0x80000000) です。

クイックウォッチ

そのため、GROUP_TYPE_SECURITY_ENABLEDおよびその他の調停フラグが設定されている場合は常に、数値が int32 の範囲を超え、オーバーフローが発生します。

groupTypeScreen

正しい値を読み取るために、このオーバーフローを回避する方法を知っている人はいますか?

4

3 に答える 3

5

@fourpastmidnight の回答とこれらの記事object-group-attribute-grouptypeおよびmsdn Group-Type attributeを参照して、ステートメント へのキャストuintや解析を必要としないソリューションを見つけることができました。最初のリンクと -2147483646 の戻り値に関する @wodzu のコメントからの負の値を見て、SECURITY_ENALBED 値を -0x80000000 に反転してみました。if ... else if

[System.Flags]
public enum GroupType
{
    BUILTIN_LOCAL_GROUP = 0x00000001,
    ACCOUNT_GROUP       = 0x00000002,
    RESOURCE_GROUP      = 0x00000004,
    UNIVERSAL_GROUP     = 0x00000008,
    APP_BASIC_GROUP     = 0x00000010,
    APP_QUERY_GROUP     = 0x00000020,
    SECURITY_ENABLED    = -0x80000000
}

値を取得して GroupType としてキャストする場合

var groupType = (GroupType)this.Entry.Properties["groupType"].Value

その後、各フラグのカンマ区切りの文字列を返す GroupType 値で .ToString() を使用できます。
または、.HasFlag メソッドを使用して、セキュリティ グループかどうかを確認できます。

bool IsSecurityGroup = groupType.HasFlag(GroupType.SECURITY_ENABLED);
于 2015-12-15T20:16:16.027 に答える