0

アイデアを説明するための簡単なテスト プログラム:

「MyBuildSecurityDescriptor」は、基本的なセキュリティ記述子を作成するためにここからコピーされた関数です。

PSECURITY_DESCRIPTOR pSecDesc = MyBuildSecurityDescriptor();

// Convert to a PISECURITY_DESCRIPTOR to view the contents.
PISECURITY_DESCRIPTOR piSecDesc = (PISECURITY_DESCRIPTOR)pSecDesc;

LPTSTR szSecDesc;
ConvertSecurityDescriptorToStringSecurityDescriptor(pSecDesc, SECURITY_DESCRIPTOR_REVISION,
                                                    DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION,
                                                    &szSecDesc,
                                                    NULL);

// At this point szSecDesc has the correct security descriptor in it.
// "D:(A;;KR;;;WD)(A;;KA;;;BA)" for those interested.

// Now to convert back from string version.
PSECURITY_DESCRIPTOR pSecurityDescriptor;
ConvertStringSecurityDescriptorToSecurityDescriptor(szSecDesc, SDDL_REVISION_1, &pSecurityDescriptor, NULL);

// Convert to a PISECURITY_DESCRIPTOR to view the contents.
PISECURITY_DESCRIPTOR piNewSecDesc = (PISECURITY_DESCRIPTOR)pSecurityDescriptor;

上記のプログラムの piSecDescpiNewSecDescの Visual Studioでのデバッグ ビューを次に示します。piSecDesc のデバッグ ビューpiNewSecDesc のデバッグ ビュー

私の質問は、変換後の SECURITY_DESCRIPTOR に正しいデータがないのはなぜですか?

これが(ConverStringSecurityDescriptorToSecurityDescriptorについて)述べていることを考えると、「この関数は、ConvertSecurityDescriptorToStringSecurityDescriptor関数が文字列形式に変換したセキュリティ記述子を取得します。」この単純なプログラムが機能すると思います。

いくつかのコンテキスト 私の仕事では、SECURITY_DESCRIPTOR を取得し、これをパイプ経由で別のプログラムに渡す必要があります。最も簡単な方法は、文字列に変換して渡し、反対側で変換することでした。

4

1 に答える 1

1

あなたが見ている違いはMyBuildSecurityDescriptor絶対的なセキュリティ記述子ConvertStringSecurityDescriptorToSecurityDescriptorを構築するのに対し、自己相対セキュリティ記述子を構築するためだと強く思います。を使用して、自己相対セキュリティ記述子を絶対セキュリティ記述子に変換できますがMakeAbsoluteSD、正直なところ、これには意味がありません。すべての Windows API は、絶対または自己相対のセキュリティ記述子を受け入れます。

MSDNは、SECURITY_DESCRIPTOR 構造の説明で明示的に次のように述べています。

セキュリティ記述子の内部形式はさまざまであるため、アプリケーションで SECURITY_DESCRIPTOR 構造を直接変更しないことをお勧めします。セキュリティ記述子を作成および操作するには、「関連項目」にリストされている関数を使用します。

この関数を使用してIsValidSecurityDescriptor(戻り値をチェックするだけでなく)、記述子の一貫性を検証します。

于 2013-10-28T19:03:04.793 に答える