Как найти нужную сессию

6 ответов

Изменение таблицы django_session для добавления явного user_id может значительно облегчить жизнь. Предполагая, что вы это делаете (или что-то подобное), вот четыре подхода к портированию вещей по вашему вкусу:

Введите код django.contrib.session. Я знаю, я знаю, что это ужасно. Но это всего 500 строк, включая все бэкэнды и минус тесты. Это довольно просто взломать. Это лучший маршрут, только если вы собираетесь сделать серьезную перестановку вещей.

Если вы не хотите использовать fork, вы можете попробовать подключиться к сигналу Session.post_save и выполнить там munge.

Или вы можете MonkeyPatch contrib.session.models.Session.save(). Просто заверните существующий метод (или создайте новый), проломите/синтезируйте любые значения, которые вам нужны, сохраните их в новых полях, а затем super(Session, self).save().

Еще один способ сделать это – установить 2 (да, два) класса промежуточного слоя – один до и один после SessionMiddleware в файле settings.py. Это происходит из-за обработки промежуточного программного обеспечения. Тот, который указан после SessionMiddleware, получит по входящему запросу запрос с уже присоединенным к нему сеансом. Один из перечисленных выше может выполнять любую обработку ответа и/или изменять/сохранять сеанс.

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

Update:

Мой ответ сейчас довольно древний, хотя он по-прежнему в основном правильный. См. @Gavin_Ballard гораздо более свежий ответ (9/29/2014) ниже для еще одного подхода к этой проблеме.

Peter Rowell
26 окт. 2008, в 00:59

Поделиться

Этот ответ публикуется через пять лет после первоначального вопроса, но этот поток SO является одним из лучших результатов Google при поиске решения этой проблемы (и он все еще не поддерживается из коробки с Django).

У меня есть альтернативное решение для варианта использования, в котором вы только занимаетесь входами в пользовательские сеансы, в котором используется дополнительная модель UserSession для сопоставления пользователей с их сеансами, примерно так:

from django.conf import settings
from django.db import models
from django.contrib.sessions.models import Session

class UserSession(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    session = models.ForeignKey(Session)  

Затем вы можете просто сохранить новый экземпляр UserSession в любое время, когда пользователь входит в систему:

from django.contrib.auth.signals import user_logged_in

def user_logged_in_handler(sender, request, user, **kwargs):
    UserSession.objects.get_or_create(user = user, session_id = request.session.session_key)

user_logged_in.connect(user_logged_in_handler)

И наконец, когда вы хотите перечислить (и, возможно, очистить) сеансы для конкретного пользователя:

from .models import UserSession

def delete_user_sessions(user):
    user_sessions = UserSession.objects.filter(user = user)
    for user_session in user_sessions:
        user_session.session.delete()

Что орехи и болты его, если вы хотите более подробно, у меня есть сообщение в блоге, охватывающее его.

Gavin Ballard
29 сен. 2014, в 10:50

Поделиться

Это несколько сложно сделать, потому что не каждый сеанс обязательно связан с аутентифицированным пользователем; Django session framework также поддерживает анонимные сеансы, и каждый, кто посещает ваш сайт, будет иметь сеанс, независимо от того, вошли ли они в систему.

Это становится еще сложнее из-за того, что сам объект сеанса сериализуется – поскольку Django не знает, какие данные вы хотите хранить, он просто сериализует словарь данных сеанса в строку (используя стандарт Python модуль “pickle” ) и материал, который содержится в вашей базе данных.

Если у вас есть ключ сеанса (который будет отправлен пользовательским браузером в качестве значения cookie “sessionid” ), самый простой способ получить данные – просто запросить таблицу сеанса для сеанса с этим ключом, который возвращает объект Session. Затем вы можете вызвать этот метод “get_decoded()” для получения словаря данных сеанса. Если вы не используете Django, вы можете посмотреть исходный код (django/contrib/sessions/models.py), чтобы посмотреть, как десериализуются данные сеанса.

Если у вас есть идентификатор пользователя, вам нужно будет пропустить все объекты сеанса, десериализовать каждый из них и найти тот, у которого есть ключ с именем “_auth_user_id” и для которого значение этого ключа идентификатор пользователя.

James Bennett
25 окт. 2008, в 07:04

Поделиться

Я нашел этот фрагмент кода

from django.contrib.sessions.models import Session
from django.contrib.auth.models import User

session_key = '8cae76c505f15432b48c8292a7dd0e54'

session = Session.objects.get(session_key=session_key)
uid = session.get_decoded().get('_auth_user_id')
user = User.objects.get(pk=uid)

print user.username, user.get_full_name(), user.email

здесь
http://scottbarnham.com/blog/2008/12/04/get-user-from-session-key-in-django/

Еще не подтвердил это, но выглядит довольно прямо.

michael
04 июнь 2011, в 19:34

Поделиться

Питер Роуэлл, спасибо за ваш ответ. Это была огромная помощь. Это то, что я сделал, чтобы заставить его работать. Только изменить один файл в djang.contrib.sessions.

В django/contrib/sessions/models.py добавьте user_id в таблицу (добавьте в таблицу DB вручную или отпустите таблицу и запустите manage.py syncdb).

class Session(models.Model):

    ...

    user_id = models.IntegerField(_('user_id'), null=True)

    ...

    def save(self, *args, **kwargs):
        user_id = self.get_decoded().get('_auth_user_id')
        if ( user_id != None ):
            self.user_id = user_id

        # Call the "real" save() method.
        super(Session, self).save(*args, **kwargs)

Теперь, когда вы используете логин (если вы используете вход в базу данных django, вам придется переопределить его)

# On login, destroy all prev sessions
        # This disallows multiple logins from different browsers
        dbSessions = Session.objects.filter( user_id = request.user.id )
        for index, dbSession in enumerate( dbSessions ):
            if ( dbSession.session_key != request.session.session_key ):
                dbSession.delete()

Это сработало для меня.

Joe
03 фев. 2011, в 23:23

Поделиться

Я столкнулся с этой проблемой, когда хотел выбросить спамера. Кажется, что их учетная запись “неактивна” недостаточна, потому что они все еще могут войти в предыдущую сессию. Итак – как удалить сеанс для определенного пользователя или как намеренно завершить сеанс для определенного пользователя?

Ответом является поле пользователя last_login для отслеживания времени, в течение которого сеанс был отключен, что говорит о том, что expire_date – две недели спустя, что позволяет вам выполнять полезный фильтр в таблице сеансов:

from django.contrib.sessions.models import Session
from django.contrib.auth.models import User
from datetime import datetime
from dateutil.relativedelta import relativedelta

baduser = User.objects.get(username="whoever")     
two_weeks = relativedelta(weeks=2)
two_hours = relativedelta(hours=2)
expiry = baduser.last_login + two_weeks
sessions = Session.objects.filter(
    expire_date__gt=expiry - two_hours,
    expire_date__lt=expiry + two_hours
) 
print sessions.count() # hopefully a manageable number

for s in sessions:
    if s.get_decoded().get('_auth_user_id') == baduser.id:
        print(s)
        s.delete()

hwjp
18 июль 2012, в 12:18

Поделиться

Ещё вопросы

  • 0Как передать структуру функции в C ++
  • 1Python: поддержка IDE для вывода запроса к базе данных, например, фрейма данных pandas
  • 0Google App Engine dns_get_record
  • 0Монго запрос на обновление, эквивалентный MySQL в
  • 0Увеличить межпроцессную строку без разделяемой памяти
  • 1Как добавить «блоки» в платформенную игру на Python, используя pygame?
  • 0angularjs: сортировка с использованием статусов приложения?
  • 1Python 3 добавляет элементы в список независимо от ключа, используемого в dict
  • 0Проблема выравнивания при отображении веб-страницы в UIWebview
  • 1Выражение Linq из Lambda: укажите параметр явно
  • 1Вычисление среднего значения каждые х мс
  • 1Регулярное выражение для захвата до определенного процента / десятичных знаков
  • 0Отображение определенного содержимого веб-сайта в веб-просмотр
  • 0Ошибка: «Ответ» не был объявлен в этой области
  • 1Как автоматически обновить экран графического интерфейса в Java, после того, как обновление происходит в сохраненном файле?
  • 0PHP Oracle Pagination не может загрузить данные на следующей странице
  • 1Замена определенного текста во всех сторонах ppt с использованием python-pptx
  • 1Объединить два файла CSV по горизонтали
  • 0как связать область / модель с угловым интерфейсом $ modal.popup ()
  • 0Есть ли способ избежать # для осады?
  • 1Поиск большого массива по двум столбцам
  • 0Неверное выражение пути. Должно быть StateFieldPathExpression
  • 1Разделительная строка, если найден разделитель
  • 0Как я могу прочитать несколько данных, используя strcpy
  • 0как найти элемент в тесте транспортира?
  • 1Изменение целевого фреймворка в приложении Xamarin.forms с Android 8.1 на Android 9 (для Xamarin.Essentials)
  • 0Почему мой простой код jQuery не работает с методом .css ()?
  • 1Превратить arraylist из строки в arraylist
  • 0активация многоуровневого меню
  • 0Вызов href из JavaScript
  • 1Что происходит с файлами при обновлении приложения?
  • 0Области применения переменных и объектов в угловых
  • 0Проблема с отображением подменю в Firefox
  • 0Табличная компоновка с двумя элементами inline-block рядом?
  • 0NumberFormatException: для входной строки: «XXX, XX» в TextField, связанной с локалью
  • 1Не удалось разрешить: firebase-ads: 15.0.1: 15.0.0
  • 0Статическая инициализация члена класса шаблона
  • 1Как объявить DOCTYPE и ENTITY в XML с помощью StAX Parser в Java
  • 0Я получаю указатель, который свободен, но не выделяется ошибка при запуске make, make test in putty
  • 1Как остановить службу переднего плана перед вызовом метода startForeground ()?
  • 1Не удается позвонить из Android WebView
  • 1стеки Java и очевидное бессмысленное упражнение
  • 1Как правильно читать числовые данные (сохраненные в текстовом файле) в Python?
  • 0Кнопка для удаления записи в таблице
  • 1JSF Hibernate Критерии API
  • 0Порядок инициализации импорта ES6 и угловых контроллеров
  • 1перераспределить данные в гауссовом распределении с помощью pd.DataFrame
  • 0jQuery, как отключить функцию щелчка для строки при нажатии на первый элемент TD?
  • 1Задача «ConvertResourcesCases» неожиданно завершилась неудачей. Xamarin Android build

Работа с сессиями

Простая авторизация

Открытие сессии

Запись и получение данных из сессии

Удаление данных из сессии

Простая авторизация

Избавление от проблемы F5

Механизм выхода из сессии

$_SESSION – ассоциативный массив, содержащий переменные сессии, которые доступны
для текущего скрипта. Это суперглобальная переменная , она доступна во всех
контекстах скрипта.

Сессия – очень полезная возможность, которая позволяет, в том числе, передавать
данные между страницами.

Это значит, коль $_SESSION – глобальный массив, то если мы запишем в него какие-то
данные на одной странице, то эти данные будут доступны на другой странице на
протяжении всей сессии (на протяжении всего сеанса), чего нет с любыми другими
массивами. Конец сессии или сеанса – это закрытие браузера .

Для работы с сессиями существуют специальные функции: php.net

Наиболее полезные функции для работы с сессиями

session_start – открывает сессию, либо возобновляет ее, если файл сессии был найден.
session_unset – она удаляет все переменные текущей сессии.
session_destroy – уничтожает все данные, связанные с текущей сессией. Данная функция
не удаляет какие-либо глобальные переменные, связанные с сессией и не удаляет
сессионные cookie.
session_id – эта функция используется для получения или установки идентификатора
текущей сессии.
session_name – возвращает имя текущей сессии. Если задан параметр name,
session_name() обновит имя сессии и вернет старое имя сессии.

Открытие сессии

session_start – это та функция, которую мы должны выполнить, перед тем, как работать
с сессиями. Данная функция запускает или открывает сессию и по сути, поскольку нам
необходимо хранить данные, которые будут доступны между страницами, то сессия –
это ничто иное как файл, который хранится во временной папке (эта папка будет
хранится в папке: userdata/temp для Open Server) В этот текстовый файл
записываются все те данные, которые мы сохраняем в сессию. И когда мы запускаем
на выполнение функцию session_start, то она создает такой файл либо обращается к
нему, если файл уже был создан ранее. Причем этот файл индивидуален для каждой
открытой сессии. Это значит, что если мы обратимся к одному и тому же скрипту
из двух различных браузеров, то под каждый браузер, под каждого клиента
будет открыт свой файл сессии и эти файлы никак друг с другом не пересекаются.
Из этого следует, что с помощью сессий, мы можем организовать механизм аторизации
пользователя, то есть получения доступа к какой-то закрытой части сайта.

Для того, чтобы понять, что данный файл принадлежит конкретному клиенту – делается
это посредством куки .

Куки – это тот же самый файл, который хранится не на сервере, а на стороне клиента
(в браузере), в нем содержится индификатор , который совпадает с идификатором файла ,
который лежит на сервере.

Запись и получение данных из сессии

Создадим простое приложение, с секретной страницей, доступ к которой будет иметь только пользователь,
который введет правильные данные.

Для примера создадим три файла: sess1.php, sess2.php и secret.php

В файле sess1.php запишем в массив $_SESSION имя Андрей .
При обновлении страницы в браузере это имя – выведится.

Функция session_start чувствительна к выводу – перед вызовом данной функции не должно
быть никакого вывода в браузер
. Если поставить перенос строки, который является
выводом в браузер, то возникнет ошибка.

Файл sess1.php

-- файл sess1.php --

// здесь ничего не должно быть
<?php

session_start(); // открываем сессию

echo session_id(); // индификатор сессии, который равен значению куки

$_SESSION ['name']= 'Андрей'; // запишем в массив имя

echo $_SESSION['name']; // выводим $_SESSION['name']

// выведет: Андрей
// в файле сессии будет записано: name|s:12:"Андрей";

?>

После обновлении страницы получим:

sess1.png

В файле сессии будет сделана запись: name|s:12:”Андрей” – сериализованная строка –
это один из способов хранения массивов данных, где:

name – ключ
s:12 – длина строки в байтах (в кодировке utf-8, буквы кирилицы равны двум байтам)
Андрей – содержимое $_SESSION[‘name’]

Если закомментировать строку $_SESSION[‘name’]= ‘Андрей’ , то в браузере, при обнавлении
все равно выведится имя Андрей, это значит, что в сессии эти данные были запомненны .
В этом можно убедиться, открыв файл сессии.

В файле sess2.php откраваем сессию и получаем доступ, к тому, что лежит в сессии
– к тому же $_SESSION[‘name’].

Файл sess2.php

-- файл sess2.php --

<?php

session_start(); // открываем сессию

echo $_SESSION['name']; // выводим $_SESSION['name']
// выведет: Андрей

?>

Удаление данных из сессии

Если мы хотим удалить из сессии конкретное значени можно использовать функцию unset(),
которая удаляет переменную – в данном случае нам надо удалить – $_SESSION[‘name’].
И удалив его, на какой то странице (на sess1.php), мы удаляем его целиком из сессии.

Если нам нужно удалить все значения сессии , то есть все переменные массива ,
можно использовать специальную функцию session_unset() которая удалит все
сессионные переменные. Сессионый файл будет очищен.

Если мы хотим уничтожить сессию, включая и сам сессионный файл, – для этого
используется функция session_destroy , хотя в куки он у нас остался и если закомментировать строку
, то файл сессии вновь образуется.

Файл sess1.php

-- файл sess1.php --

<?php

session_start(); // открываем сессию

$_SESSION['name']= 'Андрей' ; // запишем в массив имя
$_SESSION['login']= 'andrey' ; // запишем в массив логин
echo $_SESSION['name']; // выводим $_SESSION['name']

// выведет: Андрей
// в файле сессии будет записано: name|s:12:"Андрей";

unset($_SESSION['name']); // удаляем из сессии конкретное значение
session_unset(); // удаляет из сессии все переменные
session_destroy(); // уничтожает сессию, включая и сам сессионный файл

?>

Простая авторизация

Создадим пункты меню и поместим их в каждый из файлов: sess1.php , sess2.php и secret.php .
Наша задача – ограничить доступ к странице secret.

<ul>
<li><a href="sess1.php"> sess1 </a></li>
<li><a href="sess2.php"> sess2 </a></li>
<li><a href="secret.php"> secret </a></li>
</ul>

Что бы ограничить доступ к странице secret.php мы задаем простое условие (авторизация будет
происходить по логину):

Если у нас не существует (!isset ) в сессии ($_SESSION) элемент ( admin ) – мы завершим работу
и выведем:“Вы не авторизованы!”,

( die или exit – вывести сообщение и прекратить выполнение текущего скрипта)

если мы прошли проверку, то выведем: “Добро пожаловать, {$_SESSION[‘admin’]}”

Файл secret.php

-- файл secret.php --

<?php

session_start(); // открываем сессию

if ( ! isset ($_SESSION[ 'admin' ])) die( 'Вы не авторизованы!');

echo "Добро пожаловать, {$_SESSION[ 'admin' ]}";

?>

<ul>
<li><a href="sess1.php"> sess1 </a></li>
<li><a href="sess2.php"> sess2 </a></li>
<li><a href="secret.php"> secret </a></li>
</ul>

На странице файл sess1.php создадим форму авторизации:
action=”” – обработчик будет на этой же странице
method=”post” – метод POST
input type=”text” – поле ввода
name=”login” – имя “login”
type=”submit” – кнопка тип “submit”
Login – надпись

Далее нам необходимо принять данные из формы: если не пуст (!empty)
элемент с ключем login ($_POST[‘login’]), то мы должны сравнить, то что передал пользователь
с каким-то нашим логином – с тем логином, который мы разрешаем для авторизации.
Его определим в виде константы: имя константы – ADMIN, значение – строка admin
– такой логин будет разрешен.

Далее проверяем: если у нас $_POST[‘login’] будет равен значению константы ADMIN,
мы должны записать что-то в сессию, а именно создать сессионную переменную
$_SESSION[‘admin’] = ADMIN, и выведем сообщение: “Вы успешно авторизовались!”.

В противном случае выведем: “Неверный логин” .

Файл sess1.php

-- файл sess1.php --

<?php

// определяем константу для сравнения с логином пользователя
define('ADMIN' , 'admin' );

// открываем сессию
session_start();

// принимаем данные из формы

if(!empty( $_POST['login'])){
// создаем сессионную переменную
if( $_POST['login'] === ADMIN ){

$_SESSION[ 'admin' ] = ADMIN ;
echo 'Вы успешно авторизовались!';
} else{
echo 'Неверный логин' ;
}

}

?>

<ul>
<li><a href="sess1.php"> sess1 </a></li>
<li><a href="sess2.php"> sess2 </a> </li>
<li><a href="secret.php"> secret </a></li>
</ul>

<hr>

<!-- форма авторизации -->
<form action="" method="post">
<input type="text" name="login">
<button type="submit"> Login </button>
</form>

Избавление от проблемы F5

При обновлении страницы возникает проблема F5.

Чтобы избавиться от этой проблемы нам надо перезапросить страницу.
Чтобы перезапросить страницу средствами PHP, мы можем сделать редирект:
header(“location: sess1.php”). И для того, чтобы дальше ничего не выполнялось,
мы должны завершить выполнение скрипта: die, а чтобы получить сообщение о регистрации
его надо записать в сессию : $_SESSION[‘res’] = ‘Вы успешно авторизовались!’
и вывести: если у нас существует (if(isset)) в сессии $_SESSION элемент [‘res’],
то выведем его echo $_SESSION[‘res’].

То же самое мы можем сделать и для ошибки: $_SESSION[‘res’] = ‘Неверный логин’ ,
И редирект теперь нужен для любого случая, и в случае ошибки, и в случае успеха.
Вынесем его за пределы условий.

Удалим ненужную переменную из сессии: unset($_SESSION[‘res’]).

Окончательно запишем:

Файл sess1.php

-- файл sess1.php --

<?php

// открываем сессию
session_start();

// определяем константу для сравнения с логином пользователя
define('ADMIN', 'admin' );

// принимаем данные из формы

// если у нас что-то пришло POST-ом
if ( ! empty( $_POST['login'])){
// и если это равно константе ADMIN
if( $_POST['login'] === ADMIN ){

// тогда мы создадим сессионную переменную,
// чтобы мы могли попасть на страницу secret
$_SESSION [ 'admin' ] = ADMIN ;

// записываем сообщение в сессию об успехе
$_SESSION [ 'res' ] = 'Вы успешно авторизовались!' ;

} else{
// иначе запишем сообщение об ошибке
$_SESSION [ 'res' ] = 'Неверный логин' ;
}

// и сделаем в любом случае редирект,
// чтобы перезапросить страницу и сбросить данные из формы
header( "Location: sess1.php");

// и завершаем выполнение скрипта
die;

}

?>

<ul>
<li>< a href="sess1.php" > sess1 </a></li>
<li>< a href="sess2.php" > sess2 </a></li>
< li>< a href="secret.php" > secret </a></li>
</ul>

<hr>

<!-- если существует сессионная переменная, то выводим сообщение -->

<?php

if ( isset ( $_SESSION [ 'res' ])){
echo $_SESSION [ 'res' ];

// удалим ненужную переменную из сессии
//(после обновления страницы сообщение - не нужно)
unset( $_SESSION [ 'res' ]);
}

?>

<!-- форма авторизации -->
<form action="" method="post">
<input type="text" name="login">
<button type="submit"> Login </button>
</form>

sess2.png

Механизм выхода из сессии

В файле secret.php реализуем механизм выхода. При его работе из сессии будет
удалятся сессионная переменная $_SESSION[‘admin’] и пользователь без авторизации не получит сюда доступ.

Ссылка для выхода из сессии:

-- файл secret.php --

<a href= "secret.php?do=exit"> Logout </a>

В результате в массиве GET (в командной строке) получим: secret.php?do=exit,
то есть, у нас появится элемент do со значением exit.

Это значит, что мы можем добавить условие :

-- файл secret.php--

if ( isset ( $_GET [ 'do' ] && $_GET [ 'do' ] == 'exit' )){

unset ( $_SESSION [ 'admin' ]); // удаляем сессионную переменную

header ( "Location: sess1.php" ); // делаем редирект
die; // и завершаем выполнение скрипта

}

-если у нас существует в массиве $_GET элемент do и при этом $_GET[‘do’] равняется
строке exit, то мы удалим сессионную переменную $_SESSION[‘admin’].

Далее можно опять перезапросить страницу. (редирект: header(“location: sess1.php”)).

sess3.png

Структура файлов урока

php19.png

Наверх
Наверх

PowerShell Поиск сессии пользователей на серверах

Имея несколько ферм с терминальными серверами иногда нужно найти сессию пользователя на сервере. Конечно, можно перебирать руками каждый сервер но это не наш метод wink.

Для этого есть PowerShell, для которого мы напишем скрипт и он уже будет искать юзеров. Итак приступим.

  1. RUN POWERSHELL
    Запускаем PowerShell (Win+R — выполнить «PowerShell»)
  2. RUN ADMIN POWERSHELL
    Щёлкам правой кнопкой мыши по значку окна PowerShell и в появившемся контекстном меню выбираем «Запуск от имени Администратора». Откроется новое окно с синим фоном.
  3. В новом окне пишем «Set-ExecutionPolicy Unrestricted»
    PS C:Windowssystem32> Set-ExecutionPolicy Unrestricted
    
    Изменение политики выполнения
    Политика выполнения обеспечивает защиту компьютера от ненадежных скриптов. Изменение политики выполнения может
    подвергнуть компьютер риску нарушения системы безопасности, как описано в разделе справки, вызываемом командой
    about_Execution_Policies. Изменить политику выполнения?
    [Y] Да - Y  [N] Нет - N  [S] Приостановить - S  [?] Справка (значением по умолчанию является "Y"): Y
    PS C:Windowssystem32>
    
  4. Теперь наши скрипты будут работать у нас на ПК.
  5. Создаём файл «Поиск пользователей на сервере.ps1»
  6. Размещаем туда следующий код
    $Login = Read-Host -Prompt "Введите логин пользователя"
    Import-Module ActiveDirectory
    $Amount = 0
    $Matched = ""
    $Servers = Get-ADComputer -Filter { Name -like "p-ts01*"} 
    ForEach ($Server in $Servers) {
    	$ServerName = $Server.Name
        Write-host = $Server.Name
    	$connection = Test-Connection $ServerName -Count 1 -ErrorAction SilentlyContinue
    	if ($connection -ne $null){
    			$queryResults = qwinsta /server:$ServerName
    			ForEach ($queryResult in $queryResults) {
                #Write-host $queryResult -cmatch $Login
    				if ($queryResult -cmatch $Login){
                    #Write-host $ServerName
    					$Matched += "$ServerName "
    					$Amount++
    				}
    			}
    	}	
    }
    if ($Amount -gt 0){
    	Write-host "Servers where $Login Session found: $Matched" 
    } else {
    	Write-host "No $Login sessions found"
    }
    
    read-host "Press enter key to continue"
    
  7. RUN POWERSHELL SCRIPT
    Проверяем ПКМ по нашему скрипту «Выполнить с помощью PowerShell»
  8. Поиск терминальной сессии на сервере
    Указываем логин нужного пользователя и поиск пошел. (В скрипте используется -cmatch это означает, что логин пользователя чувствителен к регистру.)

Рейтинг: 0/5 – 0
голосов

Комментарии ()

    Написать комментарий

    Содержание

    1. Общее представление о сеансах входа в систему
    2. Просмотр текущих сеансов Windows
    3. Поиск активных сессий и залогиненных пользователей с Powershell
    4. Получение имени залогиненного пользователя
    5. Получение списка компьютеров
    6. Удаленное получение залогиненных пользователей
    7. Получение включенных пользователей AD
    8. Whoami или WMI
    9. Узнать сеансы пользователей windows
    10. Что такое ID сеанса
    11. Методы определения ID сеанса пользователя RDP
    12. Определение ID сеанса через quser
    13. Определение ID сеанса через qwinsta
    14. Как узнать id пользователя через диспетчер задач
    15. Как узнать id пользователя через query session
    16. Получение информации о сеансе через Get-TerminalSession
    17. Получение информации о сеансе через Get-TSSession

    Общее представление о сеансах входа в систему

    Когда пользователь, сервис или устройство регистрируются (authenticates) в Windows, Windows создает специальную структуру данных, которая называ­ется сеансом входа (logon session). Сеанс (session) — это уникальный иденти­фикатор отдельной учетной записи (account), только что осуществившей вход

    в систему. Чтобы Windows могла отслеживать, какой сеанс входа принадлежит, какой учетной записи, она назначает каждому сеансу локально уникальный идентификатор (locally unique identifier, LUID).

    Просмотр текущих сеансов Windows

    LogonSessions.exe является программой, работающей в командной строке и перечисляющей все активные сеансы входа в Windows, зарегистрированные на компьютере. Она делает это, опрашивая текущие маркеры; если, как мини­мум, один маркер ссылается на LUID сеанса, то данный сеанс входа существует.

    Свойства определяют­ся следующим образом:

    • Logon session — цифры после «Logon session’* представляют собой LUID данного сеанса;
    • User name — имя пользователя, используемое при входе в компьютер;
    • Auth package (пакет аутентификации) — динамические библиотеки (DLL), выполняющие аутентификацию полномочий, предъявляемых при входе учетной записи в систему;
    • Logon type — запрашиваемый тип входа;
    • Session — номер сеанса для пользователя, подключенного к компьютеру через Terminal Services. Если пользователь подключен не через Terminal Services, этот номер будет равен нулю.
    • SID — уникальное значение, переменной длины, которое используется для обозначения отдельных групп или объектов защиты в Windows, SID разбивается на отдельные части и каждая имеет особое назначение, неко­торые хорошо известные SID являются постоянными во всех инсталляци­ях Windows и используются для представления групп или объектов за­щиты общего характера;
    • Logon time — время входа пользователя в систему и создания сеанса;
    • Logon server — сервер, который был использован для аутентификации пользователя;
    • DNS Domain — домен DNS, который использовался в процессе аутенти­фикации;
    • UPN — имя в интернет-стиле, которое использовалось в процессе входа в систему

    Поиск активных сессий и залогиненных пользователей с Powershell

    Иногда может понадобится проверить какие в данный момент залогинены в системе, то есть являются активными. Такую информацию можно использовать для аудита, например для проверки какие учетные записи за какими компьютерами сидят или для последующей перезагрузки сервера, что бы не останавливать работу коллег. В примерах ниже рассмотрено как выполнять удаленные команды для получения активных пользователей и возврата включенных пользователей Active Directory.

    Навигация по посту

    Получение имени залогиненного пользователя

    Я не могу вспомнить готовую команду Powershell, которая бы вернула логин пользователя, но такая возможность есть через WMI:

    Есть еще вариант использовать CIM, который может работать немного быстрее:

    Обе команды могут работать удаленно если добавить атрибут ComputerName:

    Если вы планируете выполнять эти команды удаленно, то может понадобится выполнить предварительные настройки в виде открытия портов и необходимых правах.

    Получить только имя пользователя можно так:

    Как вы знаете в Winodws есть так же параллельные сеансы сервисов. Если вам нужно вернуть имена этих аккаунтов нужно использовать класс «win32_LoggedOnUser»:

    Получение списка компьютеров

    Если у вас нет списка компьютеров к которым вы планируете подключиться и узнать активного пользователя — это можно сделать через AD. На примере ниже будут возвращены все компьютеры:

    Операция по получению списка компьютеров может быть очень долгой, если у вас большой парк ПК в AD. Вы можете вернуть только компьютеры, которые не отключены в AD (Disable) следующим способом:

    Можно использовать и фильтрацию. Так я верну компьютеры имена которые начинаются на «CL»:

    Получить список имен мы можем так:

    Если у вас список компьютеров не относится к AD или имеет другой формат — то просто преобразуйте его в массив:

    Удаленное получение залогиненных пользователей

    Выше уже рассматривался вариант получения имени пользователя удаленно используя WMI и CIM. Если обе команды, то всех пользователей активных в данный момент мы можем получить так:

    Такой подход может привести к ошибкам так как мы не проверяем включены ли компьютеры:

    Мы можем просто не выводить ошибки с помощью «-ErrorAction SilentlyContinue» или заранее пинговать (что было бы правильнее с точки зрения времени выполнения). В примере ниже я так же разбиваю имя компьютера и логин в более удобный формат:

    Если вы не хотите выполнять команды удаленно через WMI, то вы можете использовать PSRemoting. От так же требует предварительных настроек, которые описаны в статье «Удаленное управление через Powershell». Команда, которая использует PSRemoting, будет выглядеть примерно так же:

    Получение включенных пользователей AD

    Если вам нужно вернуть учетные записи, которые включены в AD выполните следующую команду:

    Для возврата только отключенных учетных записей используйте $False.

    Такой подход работает и с объектами компьютеров в AD:

    Для последующей выгрузки данных в Excel почитайте статью «Как в Powershell выгрузить из AD пользователей и группы CSV».

    Whoami или WMI

    Вы можете вспомнить команду, которая так же возвращает имя пользователя:

    Как можно увидеть она вернет ту же информацию, что и класс WMI. Ситуация меняется, когда эти команды используются удаленно:

    Как видно, в случае с whoami у нас вернулось имя учетной записи выполнившей команду Powershell, а с WMI пользователь Windows.

    Узнать сеансы пользователей windows

    Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы с вами разобрали, как сделать таймер выключения компьютера. Сегодня я хочу вас научить определять ID (Уникальный идентификатор) и номер сеанса пользователя на терминальных столах. Уметь, это нужно, для решения ситуаций, когда такой сеанс зависает и пользователь не может работать и переключиться на другую ноду RDS фермы, так как посредники подключений видят, что у него есть активная сессия. Думаю. что мой опыт, описанный в статье окажется вам полезным.

    Что такое ID сеанса

    Когда пользователь входит на компьютер с включенными службами удаленных рабочих столов, для него запускается сеанс. Каждый сеанс идентифицируется уникальным идентификатором сеанса. Каждый такой сеанс ассоциируется с интерактивной оконной станцией (interactive window station) «WinSta0»; поэтому каждый сеанс связан со своей собственной оконной станцией «WinSta0». Для каждой оконной станции имеется три стандартных рабочих стола: рабочий стол Winlogon, рабочий стол с заставкой и интерактивный рабочий стол.

    Когда пользователь выходит с сервера удаленных рабочих столов (RDC), то сеанс, который клиент имеет на сервере узла сеансов удаленных рабочих столов (ранее назывался сервер терминалов), удаляется. Однако если сеанс консоли служб удаленных рабочих столов не смог завершится, то оконные станции, связанные с сеансом консоли, не удаляются, все процессы продолжают висеть. Это влияет на поведение приложений в среде служб удаленных рабочих столов, когда они настроены для работы в контексте безопасности интерактивного пользователя, также известного как режим активации объекта «RunAs Interactive User». Вот тогда, то и выявляется ID сеанса, чтобы его грохнуть.

    Методы определения ID сеанса пользователя RDP

    Существует несколько методов, которые могут вам помочь определить номер сеанса и его ID на терминальных серверах и RDS фермах.

    • Утилита quser
    • Утилита qwinsta
    • Утилита Query session
    • Оснастка диспетчер задач
    • PowerShell командлет Get-TerminalSession
    • PowerShell командлет Get-TSSession

    Определение ID сеанса через quser

    И так у меня есть RDS ферма состоящая из хостов с Windows Server 2012 R2, в базе Active Directory есть пользователь Барбоскин Геннадий Викторович. Данный пользователь вошел на терминал, работал, но по какой-то причине он завис и чтобы корректно разлогинить его сессию нам необходимо вычислить ее номер сеанса и уникальный идентификатор. Попробуем это выполнить через утилиту quser.

    QUSER — это утилита командной строки Windows, которая отображает информацию, о пользовательских сессиях на серверах и обычных компьютерах, удобна в случае удаленных рабочих столов. Может получать информацию локально и удаленно.

    Вы можете использовать эту команду, чтобы выяснить, вошел ли конкретный пользователь на конкретный сервер Session Host. Команда возвращает:

    • Имя пользователя
    • Имя сеанса на сервере Session Host
    • ID сеанса
    • Состояние сеанса (активно или отключено)
    • Время простоя (количество минут с момента последнего нажатия клавиш или движения мыши во время сеанса)
    • Дата и время входа пользователя

    Откройте командную строку cmd, лучше в режиме администратора и введите команду:

    У вас будет выведен список всех текущих сессий на вашем терминальном сервере.Если пользователей много, то сложно сразу найти нужного, так как все идет не по алфавиту. Ранее я вам показывал, как фильтровать вывод результатов в командной строке Windows, там была команда findstr. Вводим команду:

    В итоге я вижу, что номер сеанса rdp-tcp#24 и его ID 45, статус активно, это означает, что человек работает. Видно его время входа. Тот же результат можно получить и вот такой конструкцией:

    Вы наверное спросите, почему сразу так не ввели, все просто, я лишь еще раз напомнил вам, о фильтрации в cmd, которая работает почти с любой командой, так сказать универсальный ключ.

    Так же есть возможность запустить для конкретного сервера, для этого есть ключ /server

    Определение ID сеанса через qwinsta

    QWINSTA — Это утилита командной строки Windows, в задачи которой входит извлечение информации, о пользовательских сессиях на удаленных рабочих столах и выводя много полезной информации.

    Для того, чтобы получить номер сеанса с ID, введите в командной строке:

    Утилита выведет список всех авторизованных в системе пользователей, из полезной информации вы получите:

    • Сеанс — номер сеанса формата rdp-tcp#24
    • Пользователь — логин
    • ID — уникальный идентификатор сессии пользователя на терминальном столе
    • Статус — состояние сеанса (Активно или Диск (Отключено))
    • Тип
    • Устройство

    Чтобы вывести определенного пользователя, введите команду:

    Как узнать id пользователя через диспетчер задач

    Покажу и графический метод. который позволяет вам получать ID и номер сеанса на терминальных столах. Откройте диспетчер задач и перейдите на вкладку «Пользователи». У вас будет отображен список сотрудников. Тут для удобства их можно выстроить по алфавиту. Все хорошо, но нет ID и номера сеанса.

    Чтобы включить отображение нужных нам столбцов, вам необходимо щелкнуть правым кликом на область с именем столбцов. В контекстном меню поставьте галки на «Код» и «Сеанс».

    В итоге у вас теперь появилась возможность легко просматривать идентификационный код сеанса и имя сеанса, в моем примере, это RDP-Tcp#24.

    Как узнать id пользователя через query session

    QUERY SESSION — это утилита командной строки так же выводящая информацию, о вошедших в систему пользователей. Вводите в командной строке query session, вывод утилиты копия qwinsta. Вы так же будите видеть номер сеанса, логин учетной записи, ID, статус подключения.

    Получение информации о сеансе через Get-TerminalSession

    PowerShell не зря называют могучим, он поистине может все. К сожалению родных командлетов, которые бы заменяли утилиты командной строки нет, но есть возможность установить дополнительные, из репозитория. Речь пойдет, о сборнике «PowerShell Community Extensions» (Pscx 3.2.2). Данный сборник включаем в себя огромный комплекс командлетов, нас будет интересовать Get-TerminalSession.

    Установка «PowerShell Community Extensions» очень проста и выполняется одной командой. Перед установкой Pscx 3.2.2, вам необходимо обновить ваш PowerShell хотя бы до версии 5.1. Далее запускаете оболочку PowerShell от имени администратора и вводите команду:

    Про сам сборник вы можете почитать по ссылке (https://www.powershellgallery.com/packages/Pscx/3.2.2)

    Пишите на терминальном сервере Get-TerminalSession, или же можете запросить удаленно Get-TerminalSession -ComputerName 192 . 168 . 1 . 51

    Получение информации о сеансе через Get-TSSession

    Модуль PSTerminalServices, так же позволяет взаимодействовать с терминальными профилями В состав PSTerminalServices входят вот такие командлеты:

    • Disconnect-TSSession — отключает любого подключенного пользователя от сеанса.
    • Get-TSCurrentSession — предоставляет информацию о сеансе, в котором выполняется текущий процесс.
    • Get-TSProcess — получает список процессов, запущенных в определенном сеансе или во всех сеансах.
    • Get-TSServers — перечисляет все терминальные серверы в данном домене.
    • Get-TSSession — перечисляет сессии на данном терминальном сервере.
    • Send-TSMessage — отображает окно сообщения в указанном идентификаторе сеанса.
    • Stop-TSProcess — завершает процесс, запущенный в определенном сеансе или во всех сеансах.
    • Stop-TSSession — отключает сеанс, отключая любого пользователя, который может быть подключен.

    Скачать PSTerminalServices вы можете по ссылке https://github.com/imseandavis/PSTerminalServices, там будет MSI пакет, если его уже по какой-то причине не будет, то можете загрузить PSTerminalServices по ссылке слева.

    Установка PSTerminalServices проста до безобразия. На первом экране нажимаем «Next».

    При необходимости изменяем путь установки данного модуля.

    Для продолжения нажимаем «Install»

    Установка модуля завершена.

    Теперь, чтобы модуль запускался вам нужно разрешить запуск скриптов, напоминаю, что для текущего пользователя, это можно сделать вот так:

    Далее проверьте командой, что модуль PSTerminalServices доступен в системе, выполните:

    Далее импортируем модуль и запускаем его:

    На выходе вы получаете информацию, о всех ваших сеансах пользователей на терминальном столе

    Торговые сессии на форекс

    Доброго времени суток читателям нашего форекс блога. Эта статья предназначается начинающим форекс трейдерам. Мы поговорим о том, какие существует торговые сессии на форекс, о расписании сессий, какое время наиболее благоприятное для торговли на форекс, а когда стоит воздержаться от сделок. Также я поделюсь с вами индикатором для Metatrader 4, который автоматически размечает время сессий на графике.

    Торговые сессии на форекс – урок для начинающих

    Когда работает форекс ?

    Когда работает рынок форекс

    Валютный рынок форекс работает 24 часа в сутки 5 дней в неделю. Так как в разных странах разные часовые пояса, а менять валюту крупным компаниям требуется постоянно, Forex, в отличие от фондовой биржи, открыт круглосуточно.

    Расписание торговых сессий

    Порядок торговых сессий на форекс

    Технически торги на рынке Forex начинаются в воскресенье утром в Тель-Авиве и продолжаются до обеда в пятницу в Нью-Йорке. Однако тель-авивская сессия настолько мала, что ее обычно игнорируют, и настоящие торги начинаются в понедельник утром в Веллингтоне (Новая Зеландия).

    Однако Веллингтон — небольшая площадка, поэтому и обороты там небольшие. Торги начинают реально активизироваться, когда просыпаются Сидней и Токио. но когда открывается трейдинг-центр в Лондоне, площадке с самыми большими оборотами, объемы торгов просто взлетают. Когда Лондон отправляется на обед, к торгам подключается Нью-Йорк, второй по объему центр сделок с валютой. Самые большие объемы сделок проходят в период, когда в Лондоне день, а в Нью-Йорке утро. Затем Лондон закрывается, и Нью-Йорк остается главным центром торгов до конца дня. Самый вялый период торгов — на стыке закрытия Нью-Йорка (американской сессии) и открытия Веллингтона.

    Затем открывается Сидней, и цикл вновь повторяется.

    Как узнать в какое время открывается / закрывается каждая из торговых сессий?

    Все мы живем в разных часовых поясах. Россия (на текущий момент) не переводит стрелки часов на зимнее / летнее время, а Европа и Америка по-прежнему переводят. Поэтому легко может возникнуть путаница со временем торговых сессий на форекс.

    Для того, чтобы всем было ясно и понятно расписание сессий, относительно вашего местного времени, предлагаю использовать наш сервис торговых сессий. Там все интуитивно понятно, нужно только выставить ваш часовой пояс и расписание торговых сессий тут же перестроится в соответствии с вашим временем. Наглядная инструкция есть в видео-уроке в начале статьи.

    В какое время лучше всего торговать?

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

    Если вы торгуете на дневных графиках, то торговые сессии внимания можно не обращать. Вы просто открываете / закрываете позиции в конце текущей дневной свечи. То же самое с четырех-часовыми графиками (H4).

    А вот при внутридневной торговле, на графиках с периодом 1 час и ниже, наиболее благоприятный период для открытия сделок — с начала европейской и первые 2-3 часа американской сессии. По окончании этого периода стоит закрыть имеющиеся сделки и забыть о торговле до следующего дня.

    Индикатор торговых сессий

    Как и обещал в начале поста, делюсь индикатором торговых сессий для терминала MT4. Вообще подобных индикаторов очень много, мы рассмотрим самый популярный — I-sessions.

    Устанавливается индикатор по стандартной инструкции, вам нужно будет только настроить время открытия / закрытия сессий в соответствии с временем вашего брокера в торговом терминале (часы в окне «Обзор Рынка»).

    После установки I-sessions на график, вы увидите подобную картину, как на скриншоте ниже. Индикатор отображает разными цветами период каждой из торговых сессий, а также расстояние в пунктах, которая прошла цена за сессию.

    Индикатор I-sessionsкартинка увеличивается по клику

    Скачать индикатор торговых сессий на форекс

    download-blk-green

    Важно! Нюансы установки в новые билды Metatrader 4

    Добавить комментарий