LogonUserExEx()和LsaLogonUser()都接受PTOKEN_GROUPS pTokenGroups参数。我无法正确地为此参数编组我的结构。
我定义了以下结构:
[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_GROUPS
{
public UInt32 GroupCount;
// Followed by this:
public SID_AND_ATTRIBUTES[] Groups;
}
[StructLayout(LayoutKind.Sequential)]
public struct SID_AND_ATTRIBUTES
{
public IntPtr Sid;
public UInt32 Attributes;
}
然后,在我的代码中,我正在设置这样的结构:
win32.TOKEN_GROUPS tg = new win32.TOKEN_GROUPS();
tg.GroupCount = 2;
tg.Groups = new win32.SID_AND_ATTRIBUTES[2];
tg.Groups[0].Attributes = win32.SE_GROUP_ENABLED;
win32.ConvertStringSidToSid("S-1-5-32-546", out (tg.Groups[0].Sid)); // guests TEST
tg.Groups[1].Attributes = win32.SE_GROUP_ENABLED;
win32.ConvertStringSidToSid("S-1-5-32-547", out (tg.Groups[1].Sid)); // power users TEST
这一切似乎都有效(ConvertStringSidToSid两次都返回TRUE)。然后我想要 把它变成一个IntPtr,我可以传递给实际的API函数。要做到这一点,我尝试:
IntPtr pGroups = Marshal.AllocHGlobal(Marshal.SizeOf(tg))
其次是:
Marshal.StructureToPtr(tg, pGroups, false);
然而,由于“参数不正确”引发异常,因此出现问题。有谁知道为什么会这样?非常感谢您的帮助。
答案 0 :(得分:3)
您是否尝试过像这样定义TOKEN_GROUPS:
[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_GROUPS
{
public UInt32 GroupCount;
// Followed by this:
[MarshalAs(UnmanagedType.ByValArray)] // <--
public SID_AND_ATTRIBUTES[] Groups;
}
请参阅:TOKEN_GROUPS
答案 1 :(得分:0)
如果您还没有这样做,请查看http://pinvoke.net/
LsaLogonUser的页面可能有所帮助。