1

そのため、現在いくつかのピンボーク関数を操作しようとしていますが、SECURITY_INFORMATION at の各フラグの値がどこにあるのかわかりません。

リンクはこちら

既に PInvoke サイトにアクセスしましたが、SECURITY_INFORMATION の定義が正しくないようです。ここ

ConvertSecurityDescriptorToStringSecurityDescriptor メソッドを呼び出そうとすると、次のエラーがスローされるため、間違っていると思います。

A call to PInvoke function 'ConvertSecurityDescriptorToStringSecurityDescriptor' 
has unbalanced the stack. This is likely because the managed PInvoke signature 
does not match the unmanaged target signature. Check that the calling 
convention and parameters of the PInvoke signature match the target 
unmanaged signature.

しかし、ここでも、私が提供した MSDN の記事に記載されている各フラグの 16 進数値を見つける方法を知りたいと思っています。人々が魔法のように値を生成し、その記事のどこにも文書化されていないにもかかわらず、値が正しいかのようです。

編集1

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool ConvertSecurityDescriptorToStringSecurityDescriptor(IntPtr SecurityDescriptor, 
    uint RequestedStringSDRevision, 
    SECURITY_INFORMATION SecurityInformation,
    out IntPtr StringSecurityDescriptor, 
    out int StringSecurityDescriptorLen);

[Flags]
public enum SECURITY_INFORMATION  {
    OWNER_SECURITY_INFORMATION = 0x00000001,
    GROUP_SECURITY_INFORMATION = 0x00000002,
    DACL_SECURITY_INFORMATION = 0x00000004,
    SACL_SECURITY_INFORMATION = 0x00000008,
    UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
    UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
    PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000
}
4

1 に答える 1

0

試してみるいくつかのこと。初め:

[Flags]
public enum SECURITY_INFORMATION : uint  {
    OWNER_SECURITY_INFORMATION = 0x00000001,
    GROUP_SECURITY_INFORMATION = 0x00000002,
    DACL_SECURITY_INFORMATION = 0x00000004,
    SACL_SECURITY_INFORMATION = 0x00000008,
    UNPROTECTED_SACL_SECURITY_INFORMATION = 0x10000000,
    UNPROTECTED_DACL_SECURITY_INFORMATION = 0x20000000,
    PROTECTED_SACL_SECURITY_INFORMATION = 0x40000000
}

基になる型が に変更されていることに注意してくださいuint。値はここで定義されます

それでもうまくいかない場合は、次のことを試してください。

[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool ConvertSecurityDescriptorToStringSecurityDescriptor(
    IntPtr SecurityDescriptor, 
    uint RequestedStringSDRevision, 
    SECURITY_INFORMATION SecurityInformation,
    out IntPtr StringSecurityDescriptor, 
    out IntPtr StringSecurityDescriptorLen);

StringSecurityDescriptorLenこれはポインターに変わります。

最後に、.NET 4.0 を使用している場合は、呼び出し規約の扱いが明らかに変更されているため、注意が必要です。これを読んでください: https://stackoverflow.com/a/6768223/917090

上記のすべては、実際にはただの推測にすぎません。

于 2012-11-08T04:42:28.670 に答える