如何从C#调用AllocateAndInitializeSid函数?
时间:2020-03-05 18:51:31 来源:igfitidea点击:
有人可以给我一个完整有效的示例,从Ccode调用AllocateAndInitializeSid函数吗?
我找到了这个:
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
传递它们?
解决方案
回答
对于平台调用,www.pinvoke.net是新好朋友!
http://www.pinvoke.net/default.aspx/advapi32/AllocateAndInitializeSid.html
回答
如果我们以.NET 2.0或者更高版本为目标,则类System.Security.Principal.SecurityIdentifier会包装一个SID,并允许我们避免容易出错的Win32 API。
不完全是问题的答案,但是谁知道这可能是有用的。
回答
使用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); }