Имя: Пароль:
1C
 
Как получить ID пользователя.
0 sysadminlk
 
14.12.10
19:06
1c работает на сервере терминалов.
при запуске открывается только шел 1с
стоит задача выполнить logoff конкретного пользователя
Для logoff необходим id сеанса пользователя
id сеанса пользователя можно получить через quser

пример
objShell = СоздатьОбъект("WScript.Shell");
objScriptExec = objShell.Exec("quser root");
strPingResults = НРег(objScriptExec.StdOut.ReadAll());
Сообщить(strPingResults);

вываливает
Ÿž‹œ‡ž‚’…‹œ          ‘…‘              id  ‘’’“‘  ƒ…‡„…‰‘’‚. ‚…œŸ ‚•ž„
>root                  console             1  ºâ¸¢­®   ®âáãâáâ¢ã´â 14.12.2010 7:37

если по русски то
C:\Users\root>quser root
ПОЛЬЗОВАТЕЛЬ          СЕАНС              ID  СТАТУС  БЕЗДЕЙСТВ. ВРЕМЯ ВХОДА
>root                  console             1  Активно   отсутствует 14.12.2010 7
:37

зная ID пользователя можно сделать logoff любого терминального пользователя.

----------------------------------
Вопрос как из все этой каши получить id пользователя?
1 sysadminlk
 
14.12.10
19:08
короче нужно чтоб пользователь 1с мог сделать logoff любого RDP пользователя средствами 1с
к примеру через обработку
2 poligraf
 
14.12.10
19:12
(1) забавно:)
не совсем понял, тебе строчку надо распарсить или как?
щас найду какой-нибудь терминал с админскими правами, попробую:)
3 sysadminlk
 
14.12.10
19:15
нужно из строки выловить id пользователя
4 poligraf
 
14.12.10
19:20
табуляциями разделено?
5 sysadminlk
 
14.12.10
19:30
посмотрел разделение через пробелы
6 poligraf
 
14.12.10
19:35
так ты же знаешь, что ID в третьей позиции
т.е. после второго пробела
где проблемы?:)
7 sysadminlk
 
14.12.10
19:43
хм.... даа наверно можно и так
8 sysadminlk
 
14.12.10
19:43
щас попробую ))
9 poligraf
 
14.12.10
19:52
обработку дашь, да?:)
10 sysadminlk
 
14.12.10
20:35
Вот, у себя проверил все работает!
Спасибо за идею с (6) ))))

Процедура LogoffUser()
   
   Если ПустоеЗначение(UserTRM)=1 Тогда
       Предупреждение("Не указан пользователь терминала!");
       СтатусВозврата(0);
       Возврат;
   КонецЕсли;
   
   objShell = СоздатьОбъект("WScript.Shell");
   objScriptExec = objShell.Exec("quser "+СокрЛП(UserTRM)+"");                        
   strPingResults = НРег(objScriptExec.StdOut.ReadAll());
   
   //разделение предложения по словам
   Разложить = СоздатьОбъект("ТаблицаЗначений");
   Разложить.НоваяКолонка("Слово");
   Стр = СокрЛП(strPingResults);
   Пока 1=1 Цикл
       Поз = Найти(Стр," ");
       Если Поз=0 Тогда
           Разложить.НоваяСтрока();
           Разложить.Слово = Стр;
           Прервать;
       КонецЕсли;
       Разложить.НоваяСтрока();
       Разложить.Слово = Лев(Стр,Поз-1);
       Стр = СокрЛ(Сред(Стр,Поз));
   КонецЦикла;
   
   Попытка
       ID = Разложить.ПолучитьЗначение(9,1);
       КомандаСистемы("logoff "+ID+"");
       Предупреждение("Пользователю "+СокрЛП(UserTRM)+" послана команда завершения работы.");
   Исключение
       Предупреждение("Пользователь "+СокрЛП(UserTRM)+" не найден в списке.");
   КонецПопытки
   
КонецПроцедуры


-------------------
UserTRM - у меня это строка длинной в 50 символов.
Кому интересно можете в список значений добавить всех пользователей терминала и одним нажатием выкидывать любого из системы. ))))
11 big
 
14.12.10
20:38
^
12 smaharbA
 
14.12.10
20:42
cmd /v:on /c "echo off && for /f "skip=1 tokens=1,2,3" %a in ('quser') do (set user=%a & set /a id=%b > nul & set /a id=!id!+%c > nul & echo !user:^>=!:!id!)"
13 poligraf
 
14.12.10
20:44
(12) сильно. старая школа:)
14 mad hatter
 
14.12.10
20:49
интересно
15 sysadminlk
 
14.12.10
20:56
(12) аа я пробовал так... походу у меня где-то ошибка была )))
эта команда только текущего юзера выдаст.
16 sysadminlk
 
14.12.10
21:02
А не я пошутил))

C:\Documents and Settings\Администратор>cmd /v:on /c "echo off && for /f "skip=1 tokens=1,2,3" %a in
('quser') do (set user=%a & set /a id=%b > nul & set /a id=!id!+%c > nul & echo !user:^>=!:!id!)"
root :0
root :3

-------------------------------
А как получить id определенного юзера?
Все равно придется строку разбирать по словам и смотреть его id
17 smaharbA
 
14.12.10
22:41
В целом идея бредовая, а так -

Сп=СоздатьОбъект("СписокЗначений");
Стр="cmd /v:on /c ""chcp 1251| (echo {""СписокЗначений"",{) && echo off && for /f ""skip=1 tokens=1,2,3"" %a in ('quser') do (set user=%a & set /a id=%b > nul & set /a id=!id!+%c > nul & chcp 1251| echo {{""Строка"",""!id!""},""!user:>=!"",""0""},)""";
ШелСкрипт=СоздатьОбъект("WScript.Shell");
Команда=ШелСкрипт.Exec(Стр);
Стр=""+Команда.StdOut.ReadAll()+"}}";
Сп=ЗначениеИзСтроки(Стр);
Сп.ВыбратьЗначение(0);