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);
Однако, здесь что-то идет не так, как исключение: «Параметр неверен». У кого-нибудь есть идея, почему это происходит? Заранее большое спасибо за вашу помощь.