Как заставить SID в качестве группы токенов в C#? ⇐ C#

Место общения программистов C#
Anonymous
Как заставить SID в качестве группы токенов в C#?

Сообщение Anonymous »

Я использовал следующий код в течение многих лет, и он работал нормально. Код использовался в качестве компонента в VBA из MS-ACCESS. Теперь, с тех пор, как мы обновились до Windows 11, а Office 365 IsvalidsId возвращает false, а ConvertsIdtoStringsId возвращает NULL и следующее Marshal.getLastwin32error (); Возвращает 1337, что означает: «error_invalid_sid, 1337 (0x539),« Структура идентификатора безопасности недействительна. »(Как видно: https://learn.microsoft.com/en-us/windo ... rror-codes. .exe Это работает нормально. < /p>
Что изменилось?12:20: CheckForTokenGroup - InTokenInfo
12:20: CheckForTokenGroup - IsValidSid=False: 0
12:20: CheckForTokenGroup - error: 1337
12:20: CheckForTokenGroup - sidAsString:
< /code>
code: < /p>
enum TOKEN_INFORMATION_CLASS
{
TokenUser = 1,
TokenGroups,
TokenPrivileges,
TokenOwner,
TokenPrimaryGroup,
TokenDefaultDacl,
TokenSource,
TokenType,
TokenImpersonationLevel,
TokenStatistics,
TokenRestrictedSids,
TokenSessionId,
TokenGroupsAndPrivileges,
TokenSessionReference,
TokenSandBoxInert,
TokenAuditPolicy,
TokenOrigin
}

[StructLayout(LayoutKind.Sequential)]
public struct SID_AND_ATTRIBUTES
{
public IntPtr Sid;
public UInt32 Attributes;
}

[StructLayout(LayoutKind.Sequential)]
public struct TOKEN_GROUPS
{
public UInt32 GroupCount;
// Followed by this:
[MarshalAs(UnmanagedType.ByValArray)]
public SID_AND_ATTRIBUTES[] Groups;
}

[DllImport("advapi32.dll", SetLastError = true)]
static extern int GetTokenInformation(IntPtr tokenHandle, TOKEN_INFORMATION_CLASS tokenInformationClass, IntPtr tokenInformation, int tokenInformationLength, ref int returnLength);
const int GetTokenInformationFail = 0;

[DllImport("advapi32.dll")]
private static extern bool IsValidSid(IntPtr pSid);

[DllImport("advapi32", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool ConvertSidToStringSid(IntPtr securityIdentifier, out string securityIdentifierName);

var tokenInfo = Marshal.AllocHGlobal(length);
if (GetTokenInformation(tokenHandler, TOKEN_INFORMATION_CLASS.TokenGroups, tokenInfo, length, ref length) != GetTokenInformationFail)
{
logText += AddLogText("CheckForTokenGroup - InTokenInfo");
int groupCount = Marshal.ReadInt32(tokenInfo);
const int sizeDword = 4;
var groupInfoAsPointer = tokenInfo + sizeDword;
for (int i = 0; i < groupCount; i++)
{
var groupInfo = (SID_AND_ATTRIBUTES)Marshal.PtrToStructure((IntPtr)groupInfoAsPointer, typeof(SID_AND_ATTRIBUTES));
string sidAsString = string.Empty;

if (!IsValidSid(groupInfo.Sid))
{
int errorCode = Marshal.GetLastWin32Error();
logText += AddLogText("CheckForTokenGroup - IsValidSid=False: " + errorCode);
}

if (!ConvertSidToStringSid(groupInfo.Sid, out sidAsString))
{
int errorCode = Marshal.GetLastWin32Error();
logText += AddLogText("CheckForTokenGroup - error: " + errorCode);
}

logText += AddLogText("CheckForTokenGroup - sidAsString: " + sidAsString);
if (sidAsString == tokenGroupName)
{
Marshal.FreeHGlobal(tokenInfo);
return true;
}
groupInfoAsPointer += Marshal.SizeOf(typeof(SID_AND_ATTRIBUTES));
}
}
else
{
logText += AddLogText("CheckForTokenGroup - Exception");
Marshal.FreeHGlobal(tokenInfo);
throw new GetTokenInformationFailedException(Marshal.GetLastWin32Error());
}
< /code>
я попробовал: < /p>

Компилирование как x64 < /li>
Компилирование как x86 < /li>
Скомтилируется как любой CPU < /li>
convertsidtostringsid>

Подробнее здесь: https://stackoverflow.com/questions/796 ... group-in-c

Вернуться в «C#»