C#:如何为调用LogonUserExEx()(或LsaLogonUser())编组TOKEN_GROUPS

时间:2009-09-21 13:27:06

标签: c# .net pinvoke

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);

然而,由于“参数不正确”引发异常,因此出现问题。有谁知道为什么会这样?非常感谢您的帮助。

2 个答案:

答案 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的页面可能有所帮助。