代码之家  ›  专栏  ›  技术社区  ›  Marek Grzenkowicz

如何从C#调用AllocateAndInitializeSid函数?

  •  2
  • Marek Grzenkowicz  · 技术社区  · 18 年前

    有谁能给我一个完整的和工作的例子,呼吁 AllocateAndInitializeSid

    我发现 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
    );
    

    我不知道如何构造这个方法的签名-我应该怎么做 PSID_IDENTIFIER_AUTHORITY 和 PSID 类型?我应该如何通过他们-使用 ref 或 out ?

    3 回复  |  直到 15 年前
        1
  •  3
  •   jfs    18 年前

    使用 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);
    
        }
    
        2
  •  2
  •   Paul Lalonde    18 年前

    如果您的目标是.NET 2.0或更高版本,则类System.Security.Principal.SecurityIdentifier会包装一个SID,并允许您避免易出错的Win32 API。

    这不完全是你问题的答案,但谁知道它可能有用。