C #: как выполнить маршалинг TOKEN_GROUPS для вызова LogonUserExEx () (или LsaLogonUser ()) - PullRequest
0 голосов
/ 21 сентября 2009

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 ]

3 голосов
/ 21 сентября 2009

вы пытались определить 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

0 голосов
/ 21 сентября 2009

Если вы еще этого не сделали, посмотрите на http://pinvoke.net/

Может помочь страница для LsaLogonUser .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...