|
Компьютерный форум OSzone.net » Серверные продукты Microsoft » Microsoft Windows NT/2000/2003 » [решено] Как ограничить количество запущенных копий приложения на терминальном сервере? |
|
[решено] Как ограничить количество запущенных копий приложения на терминальном сервере?
|
Vladimir Сообщения: 1070 |
Профиль | Отправить PM | Цитировать
Q: Можно ли на терминальном сервере Windows Server 2003 ограничить одновременное количество запусков определённой программы терминальным пользователям?
Цель: Имея Z пользователей терминальных, и N лицензий на Office 2003, как на сервере ограничить количество загрузок приложений Office, не более N-ти одновременно? Возможно ли это? A: Стандартных способов ограничения по количеству копий процесса я не смог найти, однако в WMI командах есть возможность выполнять отображение количество запущенных процессов. Поэтому я обратился к Центру сценариев и составил небольшой сценарий, который, работая резидентно – отслеживает процессы загрузки приложения , например блокнота (notepad.exe) или калькулятора (calc.exe) - по счетчику отслеживает количество работающих приложений. При этом, он виден как процесс wscript.exe в диспетчере задач. В целях понимания работы программы даны всплывающие окна, потом их можно убрать. * Для добавления других приложений можно модифицировать данные файла конфигурации (например, вместо notepad.exe указать winword.exe, добавить WinRAR и т.д.) ** Сценарий, указанный тут, предназначем для запуска в приложении Cscript.exe. Поэтому если программой для запуска сценариев по умолчанию она не является на вашей системе - вам необходимо добавить перед сценарием имя программу "cscript", например, cscript watcher.vbs. Скрипт watcher.vbs Set Args = WScript.Arguments ' ******************************************* ' Script, that allow to limit quantity of the ' started applications on a terminal server. ' The names of applications and the maximum ' quantity of simultaneously started spears ' are stored in config file. ' ' @authors: SkyF, hasherfrog ' @site: oszone.net ' CONST FIELDS = 3 CONST PSNAME = 0 CONST PSNUMB = 1 CONST PSMAXN = 2 Dim thePsArray ( ) Dim nToWatch nToWatch = 0 Function AddPsToWath( name, number ) ReDim Preserve thePsArray ( FIELDS, nToWatch ) thePsArray(PSNAME, nToWatch) = name thePsArray(PSNUMB, nToWatch) = number thePsArray(PSMAXN, nToWatch) = number addPsToWatch = nToWatch nToWatch = nToWatch + 1 End Function ' ******************************************* Sub ReadPsWatchFile(filename) Dim fso, f ' On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile(filename, 1, False) if Err.Number<>0 then call Error_(0) else while not f.atEndOfStream s = f.ReadLine ms = Split(s, " ", -1, vbBinaryComapre) s1 = ms(0) n2 = CInt(ms(1)) n = AddPsToWath(s1, n2) Err.Clear wend f.Close end if End Sub ' ******************************************* Sub StartUpWatcher() strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ ("SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE " _ & "Targetinstance ISA 'Win32_Process'") Do While 1 Set objLatestProcess = colMonitoredEvents.NextEvent For psn=0 to nToWatch-1 If objLatestProcess.TargetInstance.Name = thePsArray(PSNAME, psn) Then Select Case objLatestProcess.Path_.Class Case "__InstanceCreationEvent" thePsArray(PSNUMB, psn) = thePsArray(PSNUMB, psn) - 1 If thePsArray(PSNUMB, psn) < 0 then objLatestProcess.TargetInstance.Terminate Wscript.Echo "Вы запустили лишнюю копию программы "& objLatestProcess.TargetInstance.Name _ & " - разрешенный лимит только " & thePsArray(PSMAXN, psn) End If Case "__InstanceDeletionEvent" thePsArray(PSNUMB, psn) = thePsArray(PSNUMB, psn) + 1 End Select End If Next Loop End Sub ' ******************************************* for i=0 to Args.count-1 If Args(i) = "-f" Then iaFilename = Args(i+1) End If Next If iaFilename<>"" Then Set fso = CreateObject("Scripting.FileSystemObject") If (fso.FileExists(iaFilename)) Then Call ReadPsWatchFile(iaFilename) If nToWatch=0 Then Wscript.Echo "File is empty." Else Call StartUpWatcher() End If Else Wscript.Echo "File exists not." End If Else Wscript.Echo "watcher.vbs -f config.txt" End If После запуска сценария - он запускается резидентно и выполняет перехват событий запуска процесса, сравнивает название процесса с заранее заданными и в случае совпадения - передает управление счетчику. Если лимит будет исчерпан - для нового процесса будет вызван метод завершения. Процесс может быть запущен из любой терминальной сессии, а сценарий должен запускаться от имени системы (те при запуске ОС) Любые изменения приветствуются! ЗЫ полезные ссылки: http://www.microsoft.com/technet/scr.../shop0505.mspx http://www.microsoft.com/technet/com...ts/sg0103.mspx http://msdn.microsoft.com/library/de..._processes.asp (тут иной вариант - через получение списка из процессов – можно тоже попробовать) Благодарим за доработку скрипта hasherfrog |
|
Отправлено: 16:53, 15-04-2006 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать Скрипт watcher.vbs
ShaddyR> см. в прикрепленном сообщение. |
Последний раз редактировалось ShaddyR, 11-07-2006 в 15:09. Отправлено: 22:27, 07-07-2006 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Железных Дел Мастер Сообщения: 24526
|
Профиль | Сайт | Отправить PM | Цитировать Спасибо, у тебя получилось!!
Единственный нюанс - терминальная система, для которой все пишется. Ибо в текущем варианте все работает на однопользовательской, а проверка в терминальной среде показала следующий глюк: запуск приложений контролируется, но 1) сообщение о лимите выводится в сеанс, в котором запущен скрипт. 2) ессно, закрытие копии в сеансе другого пользователя также не производится, вне зависимости от прав юзера, под которым скрипт запущен. Если будет время, косметика: 1) переименуй конф-файл в .ini (с именем скрипта, но поиском и его поиском по умолчанию, если не задана командная строка) 2) добавь опцию командной строки для добавления файла и кол-ва запусков в указанный конф. файл (либо в к.ф. по-умолчанию, если ничего не указано). С удалением справятся вручную ничего личного, все от имени и во благо юзеров А вообще - спасибо.. визуальный Барсик - сильная весчь) dosim: есть еще пожелания к создателю скрипта? |
------- Отправлено: 12:59, 08-07-2006 | #12 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать ShaddyR
Я боюсь, что Вы не совсем поняли, как это работает (или я сам не совсем понял). 1) сообщение о лимите выводится в сеанс, в котором запущен скрипт. Конечно. Естественно. И я не знаю, а как же иначе-то? Как я понял: Этот скрипт запускается при входе на сервер для каждого пользователя. Т.е. кто-то входит - у него запускается логон-скрипты, в том числе и этот. И для каждого, кто зашёл, действует _персональный_ лимит на количество блокнотов-калькуляторов. Не один на всех этот скрипт, а каждому - свой. Возможно, я не совсем вкурил механизм действия скрипта, но у меня нет терминал-севрера, к сожалению :-\ 2) ессно, закрытие копии в сеансе другого пользователя также не производится, вне зависимости от прав юзера, под которым скрипт запущен. И не должно, так как по замыслу (см. выше) скрипт не контролирует других пользователей, а лишь данного конкретного. И кстати, вот какой момент. Закрытие сейчас производится _до_вывода_ сообщения "Вы превысили лимит". Т.е. пользователь запустил блокнот - скрип 1) проверил лимит, 2) _закрыл_блокнот, 3) сообщил о превышении лимита. Если поменять местами 2 и 3, пользователь может устроить затык скрипту (вообще-то, он и сейчас, наверное, сможет, при должном усердии). --- По косметике: 1) переименуй конф-файл в .ini (с именем скрипта, но поиском и его поиском по умолчанию, если не задана командная строка) Вроде не сложно, только несколько неоднозначностей. Где что лежит? Где (в какой папке) нужно искать конфиг? 2) добавь опцию командной строки для добавления файла и кол-ва запусков в указанный конф. файл (либо в к.ф. по-умолчанию, если ничего не указано). С удалением справятся вручную Вот это - вообще нельзя, насколько я соображаю. Скрипт действует в своём "коконе". Чтобы кто-то смог сообщить ему об изменении политики партии ("следи, мол, ещё и за этим вот файлом"), этот кто-то должен... в общем, речь идёт о inter-process communications. (см тут, я слишком косноязык). А вот умеет ли wscript.exe делать такие штучки - я сомневаюсь. |
Отправлено: 21:53, 08-07-2006 | #13 |
Пользователь Сообщения: 87
|
Профиль | Отправить PM | Цитировать hasherfrog я запустил этот скрипт, всё работает т.е. процесс считывает, при запуске выше лимта выходит сообщение "Вы запустили лишную копию программы " ок нажимаешь програмка закрывается, но пока ты ок не нажмёшь програмка работает. Посмотрите в чем проблема? Сделайте чтобы, сообщение выходил и процесс сразу убивал, т.е до нажатие ОК. |
------- Отправлено: 08:48, 10-07-2006 | #14 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать dosim
Как Цитата:
Цитата:
|
||
Отправлено: 10:18, 10-07-2006 | #15 |
Пользователь Сообщения: 87
|
Профиль | Отправить PM | Цитировать hasherfrog Нет, пока ОК не нажмешь программа не закрывается.
|
------- Отправлено: 12:30, 10-07-2006 | #16 |
Железных Дел Мастер Сообщения: 24526
|
Профиль | Сайт | Отправить PM | Цитировать dosim: ты не прав. Нелимитная копия закрывается прежде сообщения, проверено на калькуляторах.
> Цитата:
> насчет терминала... мож, я переборщил, это действительно не нужно. Просто основная идея озвучена в первом сообщении, примерно таким образом: Цитата:
Еще раз спасибо. |
||
------- Отправлено: 13:27, 10-07-2006 | #17 |
Пользователь Сообщения: 87
|
Профиль | Отправить PM | Цитировать всё работает
|
------- Отправлено: 13:57, 10-07-2006 | #18 |
Старый параноик Сообщения: 2423
|
Профиль | Отправить PM | Цитировать ShaddyR
Давайте по мелочам доразберёмся. У меня нет терминального сервера, поэтому придётся спрашивать у Вас. Если данный скрипт запустит администратор, пользователи, превысившие лимит, могут открыть блокноты-калькуляторы? Дело в том, что я (кажется) придумал, как сообщать именно контретному пользователю о том, что именно он превысил лимит. Причём "ступора" не будет (а сейчас он есть, возможен). Уберите строку Wscript.Echo "Вы запустили лишнюю копию программы "& objLatestProcess.TargetInstance.Name _ & " - разрешенный лимит только " & thePsArray(PSMAXN, psn) А там, может и до IPC дойдём (есть идея). |
Отправлено: 14:06, 10-07-2006 | #19 |
Железных Дел Мастер Сообщения: 24526
|
Профиль | Сайт | Отправить PM | Цитировать hasherfrog: честно - не понял идеи. Сделал: ничего не выводит, молча убивает в сеансе, где запущен.
|
------- Отправлено: 15:20, 11-07-2006 | #20 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Win 2003 SP1 - Как ограничить количество подключений под одним логином? | allzero | Microsoft Windows NT/2000/2003 | 7 | 19-01-2009 14:19 | |
Разное - Количество одновременно запущенных приложений или окон | Sandjar | Microsoft Windows 2000/XP | 7 | 21-05-2008 16:28 | |
[решено] Как на терминальном сервере 2003 у каждого нового юзера задать тему оформления? | Angry Demon | Microsoft Windows NT/2000/2003 | 7 | 23-10-2006 11:17 | |
[решено] Как в списке принтеров на терминальном сервере сделать только 1 принтер,а не все | rooty | Microsoft Windows NT/2000/2003 | 7 | 23-09-2005 08:38 | |
Как ограничить количество одновреммено качаемых файлов ? | allalone | Сетевые технологии | 8 | 22-05-2004 03:12 |
|