169 похожих чатов

Ещё интересный вопрос. Есть утилита quser. Я легко могу распарсить

её результат, но она не выводит домен юзера. Есть у кого нибудь аналог на поше или хотя бы в какой api тыкать можете подсказать?

33 ответов

55 просмотров

https://www.powershellgallery.com/packages/PSReflect-Functions/1.1/Content/wtsapi32%5CWTSQuerySessionInformation.ps1

Есть, соль состоит том что парситься вывод quser'а, далее делается get-aduser с интересующими атрибутами..если get-aduser пустой значит юзер локальный

Dmitry- Автор вопроса
Aleksandr
https://www.powershellgallery.com/packages/PSRefle...

Не поручусь на счёт результатов "WTSQuerySessionInformation", но выглядит правдоподобно. Вроде как, для данных целей NetWkstaUserEnum использовалась. Но там множество вариантов использовалось со своими особенностями.

Dmitry 🦝
Есть, соль состоит том что парситься вывод quser'а...

Однозначно - крайне неудачный подход.

Stanvy
Однозначно - крайне неудачный подход.

Не будьте столь однозначны ..говорю исключительно с точки зрения практики, а не теории которую не щупал..userEnum имеет свои "приколы".

Stanvy
Не поручусь на счёт результатов "WTSQuerySessionIn...

Как вариант - можно через реестр извратиться, но я бы, пожалуй, не рекомендовал.

Dmitry- Автор вопроса
Aleksandr
https://www.powershellgallery.com/packages/PSRefle...

Ну, такой способ я предполагал, но поскольку формат модуля мне не подходит, то мне надо руками пересобрать это в отдельно работающий командлет. Я просто думал может быть у кого то есть что то готовое?

Dmitry 🦝
Не будьте столь однозначны ..говорю исключительно ...

Постоянно следую данной рекомендации, но в данном случае вынужден отклониться по ряду причин.

Dmitry- Автор вопроса
Aleksandr
Код открыт бери да переноси.

Так бы я и без вас справился.

Dmitry 🦝
Не будьте столь однозначны ..говорю исключительно ...

Это и безумно медленно и ненадёжно и, как правильно подметили выше - у вас может быть огромный лес.

Dmitry
Ну, такой способ я предполагал, но поскольку форма...

А чем именно не подходит данный формат?

Stanvy
Как вариант - можно через реестр извратиться, но я...

Вот тут находится список всех ульев, загруженных в данный момент в реестр: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist Пользовательские имеют формат следующего вида: \REGISTRY\USER\%SID% Если так можно выразиться, прелесть в том, что не требуется никаких особых знаний и привилегий чтоб это прочесть.

Dmitry- Автор вопроса
Stanvy
Не поручусь на счёт результатов "WTSQuerySessionIn...

Вот это судя по всему топчик. Сча буду собирать

Stanvy
Это и безумно медленно и ненадёжно и, как правильн...

В любом лесу есть глобальный каталог? Подводный камень предложенный из gallery работает только для терминальных серверов(или даже опубликованных RD - могу огибаться пару лет назад тестировал), для локально вошедших оно тоже не применимо..так что придётся делать компиляцию из всего если нужна подробная инфомация

Dmitry 🦝
В любом лесу есть глобальный каталог? Подводный ка...

Конечно есть, но это не делает подход адекватным в моём понимании. Например, как быть со случаем когда пользователь "Вася ГусеФ" может существовать в двух доменах и ещё и в качестве локального пользователя на машине?

Dmitry
Вот это судя по всему топчик. Сча буду собирать

У вас там в каком виде это запускаться будет?

Dmitry
Вот это судя по всему топчик. Сча буду собирать

Есть скрипт, который преобразовывает вывод quser в читаемый вид (в виде массива), если его немного допилить, то можно и домен пользователя дописать в отдельное свойство, взяв его из \HKEY_USERS\S-1-5-21-570079237-2135344701-1905390631-29901\Volatile Environment Если нужно, могу скинуть в личку

Dmitry- Автор вопроса
Stanvy
Не поручусь на счёт результатов "WTSQuerySessionIn...

Сделал эту хрень. Короче, она кучу дублей выдаёт и session id не показывает. Буду переделывать на функции из Wtsapi32.dll

Dmitry
Сделал эту хрень. Короче, она кучу дублей выдаёт и...

В общем, сговнякал тут рабочий набросок. Для начала, подготовительная обвязка: #################################################################################################### Add-Type -Language "CSharp" -TypeDefinition @" using System; using System.Runtime.InteropServices; namespace PInvoke { [StructLayout(LayoutKind.Explicit)] public struct Int64Value { [FieldOffset(0)] public Int64 Value; [FieldOffset(0)] public UInt32 Low; [FieldOffset(4)] public Int32 High; } public enum SECURITY_LOGON_TYPE : uint { UndefinedLogonType = 0, Interactive = 2, Network, Batch, Service, Proxy, Unlock, NetworkCleartext, NewCredentials, RemoteInteractive, CachedInteractive, CachedRemoteInteractive, CachedUnlock } public struct LUID { public UInt32 LowPart; public Int32 HighPart; } public struct LSA_LAST_INTER_LOGON_INFO { public UInt64 LastSuccessfulLogon; public UInt64 LastFailedLogon; public UInt32 FailedAttemptCountSinceLastSuccessfulLogon; } public struct LSA_UNICODE_STRING { public UInt16 Length; public UInt16 MaximumLength; public IntPtr Buffer; } public struct SECURITY_LOGON_SESSION_DATA { public UInt32 Size; public LUID LogonId; public LSA_UNICODE_STRING UserName; public LSA_UNICODE_STRING LogonDomain; public LSA_UNICODE_STRING AuthenticationPackage; public SECURITY_LOGON_TYPE LogonType; public UInt32 Session; public IntPtr Sid; public UInt64 LogonTime; public LSA_UNICODE_STRING LogonServer; public LSA_UNICODE_STRING DnsDomainName; public LSA_UNICODE_STRING Upn; public UInt32 UserFlags; public LSA_LAST_INTER_LOGON_INFO LastLogonInfo; public LSA_UNICODE_STRING LogonScript; public LSA_UNICODE_STRING ProfilePath; public LSA_UNICODE_STRING HomeDirectory; public LSA_UNICODE_STRING HomeDirectoryDrive; public UInt64 LogoffTime; public UInt64 KickOffTime; public UInt64 PasswordLastSet; public UInt64 PasswordCanChange; public UInt64 PasswordMustChange; } public class Secur32 { [DllImport("Secur32", SetLastError = true, CharSet = CharSet.Auto)] public static extern UInt32 LsaEnumerateLogonSessions( out UInt32 LogonSessionCount, out IntPtr LogonSessionList ); [DllImport("Secur32", SetLastError = true, CharSet = CharSet.Auto)] public static extern UInt32 LsaGetLogonSessionData( IntPtr LogonId, out IntPtr ppLogonSessionData ); [DllImport("Secur32", SetLastError = true, CharSet = CharSet.Auto)] public static extern UInt32 LsaFreeReturnBuffer( IntPtr Buffer ); } } "@ ####################################################################################################

Dmitry
Сделал эту хрень. Короче, она кучу дублей выдаёт и...

А дальше уже сам процесс: [System.UInt32] $NTSTATUS = 0 [System.UInt64] $LogonSessionCount = 0 [System.IntPtr] $LogonSessionList = [System.IntPtr]::Zero $NTSTATUS = [PInvoke.Secur32]::LsaEnumerateLogonSessions([ref] $LogonSessionCount, [ref] $LogonSessionList) $iLUIDSize = [Runtime.InteropServices.Marshal]::SizeOf([System.Type] [PInvoke.LUID]) [System.IntPtr] $LogonSessionData = [System.IntPtr]::Zero $colLogonSessions = New-Object -TypeName System.Collections.ArrayList for ($iIndex = 0; $iIndex -lt $LogonSessionCount; $iIndex++) { $NTSTATUS = [PInvoke.Secur32]::LsaGetLogonSessionData($LogonSessionList, [ref] $LogonSessionData) $objLogonSessionData = [System.Runtime.InteropServices.Marshal]::PtrToStructure($LogonSessionData, [System.Type] [PInvoke.SECURITY_LOGON_SESSION_DATA]) $objSID = try {New-Object -TypeName System.Security.Principal.SecurityIdentifier($objLogonSessionData.Sid)} catch {"Her ego znaet!"} $iLogonId = New-Object -TypeName PInvoke.Int64Value $iLogonId.Low = $objLogonSessionData.LogonId.LowPart $iLogonId.High = $objLogonSessionData.LogonId.HighPart $hshLogonSession = @{ "LogonId" = $iLogonId.Value "UserName" = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($objLogonSessionData.UserName.Buffer, $objLogonSessionData.UserName.Length / 2) "LogonDomain" = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($objLogonSessionData.LogonDomain.Buffer, $objLogonSessionData.LogonDomain.Length / 2) "AuthenticationPackage" = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($objLogonSessionData.AuthenticationPackage.Buffer, $objLogonSessionData.AuthenticationPackage.Length / 2) "LogonType" = $objLogonSessionData.LogonType "Session" = $objLogonSessionData.Session "Sid" = $objSID "DnsDomainName" = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($objLogonSessionData.DnsDomainName.Buffer, $objLogonSessionData.DnsDomainName.Length / 2) "Upn" = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($objLogonSessionData.Upn.Buffer, $objLogonSessionData.Upn.Length / 2) } $null = $colLogonSessions.Add((New-Object -TypeName PSObject -Property $hshLogonSession)) $NTSTATUS = [PInvoke.Secur32]::LsaFreeReturnBuffer($LogonSessionData) $LogonSessionList = $LogonSessionList.ToInt64() + $iLUIDSize } $NTSTATUS = [PInvoke.Secur32]::LsaFreeReturnBuffer($LogonSessionList)

Stanvy
А дальше уже сам процесс: [System.UInt32] $NTSTATU...

Ну и, как я сказал - это просто набросок для целей демонстрации, так что обработка ошибок отсутствует.

Dmitry- Автор вопроса
Stanvy
По сути - это тоже не он;).

Но хотя бы без вызова внешних программ. Я, кстати, переписал на чистый дотнет без C# вставок, а то я считаю, что вставки C# кода это не канонично.

Dmitry- Автор вопроса
Stanvy
Показывайте...

Вечером покажу

Stanvy
В общем, сговнякал тут рабочий набросок. Для нача...

Этот вариант только имя локального пользователя выводит.

Dmitry- Автор вопроса
Stanvy
Этот вариант только имя локального пользователя вы...

На вкладке "Сведения" в обрезанном виде

Vasily Gusev
винапи? :)

Скорее, тот же .NET.

Dmitry
Вечером покажу

У вас, кстати, вечер когда наступает:)?

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
11
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
думаешь я не смогу также сделать? мне это просто не удобно
int 💳 𝙖𝙞𝙧 𝙗𝙞𝙜 𝙗𝙤𝙗 🔫 check bio / spam block / AFK / nohello.com / GMT+3
9
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
4
Карта сайта