2008-09-11 4 views
2

Kann mir jemand ein vollständiges und funktionsfähiges Beispiel für den Aufruf der AllocateAndInitializeSid-Funktion aus dem C# -Code geben?Wie die AllocateAndInitializeSid-Funktion von C# aufgerufen wird?

Ich fand this:

BOOL WINAPI AllocateAndInitializeSid(
    __in PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority, 
    __in BYTE nSubAuthorityCount, 
    __in DWORD dwSubAuthority0, 
    __in DWORD dwSubAuthority1, 
    __in DWORD dwSubAuthority2, 
    __in DWORD dwSubAuthority3, 
    __in DWORD dwSubAuthority4, 
    __in DWORD dwSubAuthority5, 
    __in DWORD dwSubAuthority6, 
    __in DWORD dwSubAuthority7, 
    __out PSID *pSid 
); 

und ich weiß nicht, wie die Signatur dieser Methode zu konstruieren - was soll ich tun mit PSID_IDENTIFIER_AUTHORITY und PSID Typen? Wie sollte ich sie weitergeben - mit ref oder out?

Antwort

1

Mit P/Invoke Interop Assistant:

[System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] 
    public struct SidIdentifierAuthority { 

     /// BYTE[6] 
     [System.Runtime.InteropServices.MarshalAsAttribute(
      System.Runtime.InteropServices.UnmanagedType.ByValArray, 
      SizeConst = 6, 
      ArraySubType = 
      System.Runtime.InteropServices.UnmanagedType.I1)] 
     public byte[] Value; 
    } 

    public partial class NativeMethods { 

     /// Return Type: BOOL->int 
     ///pIdentifierAuthority: PSID_IDENTIFIER_AUTHORITY->_SID_IDENTIFIER_AUTHORITY* 
     ///nSubAuthorityCount: BYTE->unsigned char 
     ///nSubAuthority0: DWORD->unsigned int 
     ///nSubAuthority1: DWORD->unsigned int 
     ///nSubAuthority2: DWORD->unsigned int 
     ///nSubAuthority3: DWORD->unsigned int 
     ///nSubAuthority4: DWORD->unsigned int 
     ///nSubAuthority5: DWORD->unsigned int 
     ///nSubAuthority6: DWORD->unsigned int 
     ///nSubAuthority7: DWORD->unsigned int 
     ///pSid: PSID* 
     [System.Runtime.InteropServices.DllImportAttribute("advapi32.dll", EntryPoint = "AllocateAndInitializeSid")] 
     [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] 
     public static extern bool AllocateAndInitializeSid(
      [System.Runtime.InteropServices.InAttribute()] 
      ref SidIdentifierAuthority pIdentifierAuthority, 
      byte nSubAuthorityCount, 
      uint nSubAuthority0, 
      uint nSubAuthority1, 
      uint nSubAuthority2, 
      uint nSubAuthority3, 
      uint nSubAuthority4, 
      uint nSubAuthority5, 
      uint nSubAuthority6, 
      uint nSubAuthority7, 
      out System.IntPtr pSid); 

    } 
0

Für Platform Invoke www.pinvoke.net ist Ihr neuer bester Freund!

http://www.pinvoke.net/default.aspx/advapi32/AllocateAndInitializeSid.html

+0

dort gewesen. Der erste Parameter ist 'ein Zeiger auf eine SID_IDENTIFIER_AUTHORITY Struktur' nach MSDN und pinvoke.net sagt, es ist IntPtr. Ist es das Gleiche? Wie soll ich diesen Zeiger erstellen? Bitte schreiben Sie ein _complete_ Beispiel. Ich habe alles ausprobiert, was ich online gefunden habe, und ich kann es nicht funktionieren lassen. –

1

Wenn Sie .NET 2.0 oder höher zielen, die Klasse System.Security.Principal.SecurityIdentifier einen SID wickelt und ermöglichen Ihnen, den fehleranfällige Win32-APIs zu vermeiden.

Nicht genau eine Antwort auf Ihre Frage, aber wer weiß, kann es nützlich sein.

Verwandte Themen