Есть задача, получить, WIN32 структуру SID, делаем так:
IntPtr logonToken;
WIN32API.LogonUser(
"t1",
"",
"t1",
WIN32API.LogonType.LOGON32_LOGON_NETWORK,
WIN32API.LogonProvider.LOGON32_PROVIDER_DEFAULT,
out logonToken);
WindowsIdentity loggedIdentity = new WindowsIdentity(logonToken);
byte[] ByteSidRepresentation = new byte[loggedIdentity.User.BinaryLength];
loggedIdentity.User.GetBinaryForm(ByteSidRepresentation, 0);
IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
ByteSidRepresentation,
0);
PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
pSID,
typeof(PtBvTasksLibrary._SID));
Особенно интересует валидность выделенного куска кода, ибо никакого Pinned я там не делаю и не очю понимаю что от меня хотят
Здравствуйте, Tom, Вы писали:
Насколько я понимаю, надо так
GCHandle h = GCHandle.Alloc(ByteSidRepresentation, GCHandleType.Pinned);
IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
ByteSidRepresentation,
0);
PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
pSID,
typeof(PtBvTasksLibrary._SID));
h.Free();
Наличие проблемы проверяется так
IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
ByteSidRepresentation,
0);
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// тут получим мусор
PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
pSID,
typeof(PtBvTasksLibrary._SID));
Здравствуйте, adontz, Вы писали:
A>Насколько я понимаю, надо так
A>
A> GCHandle h = GCHandle.Alloc(ByteSidRepresentation, GCHandleType.Pinned);
A> IntPtr pSID = Marshal.UnsafeAddrOfPinnedArrayElement(
A> ByteSidRepresentation,
A> 0);
A> PtBvTasksLibrary._SID SID = (PtBvTasksLibrary._SID) Marshal.PtrToStructure(
A> pSID,
A> typeof(PtBvTasksLibrary._SID));
A> h.Free();
A>
Лучше бы Free положить в finally.