Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Серверные продукты Microsoft » Microsoft Windows NT/2000/2003 » [решено] Как ограничить количество запущенных копий приложения на терминальном сервере?

Ответить
Настройки темы
[решено] Как ограничить количество запущенных копий приложения на терминальном сервере?

Аватара для SkyF

Vladimir


Сообщения: 1070
Благодарности: 17

Профиль | Отправить PM | Цитировать


Изменения
Автор: ShaddyR
Дата: 10-07-2006
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
Запуск
Код: Выделить весь код
watcher -f config.txt
Пример config.txt
Код: Выделить весь код
notepad.exe 2
calc.exe 3


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

Любые изменения приветствуются!

ЗЫ полезные ссылки:
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

 

Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Скрипт watcher.vbs
ShaddyR> см. в прикрепленном сообщение.

Последний раз редактировалось ShaddyR, 11-07-2006 в 15:09.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:27, 07-07-2006 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для ShaddyR

Железных Дел Мастер


Moderator


Сообщения: 24526
Благодарности: 4498

Профиль | Сайт | Отправить PM | Цитировать


Спасибо, у тебя получилось!!
Единственный нюанс - терминальная система, для которой все пишется. Ибо в текущем варианте все работает на однопользовательской, а проверка в терминальной среде показала следующий глюк: запуск приложений контролируется, но
1) сообщение о лимите выводится в сеанс, в котором запущен скрипт.
2) ессно, закрытие копии в сеансе другого пользователя также не производится, вне зависимости от прав юзера, под которым скрипт запущен.

Если будет время, косметика:
1) переименуй конф-файл в .ini (с именем скрипта, но поиском и его поиском по умолчанию, если не задана командная строка)
2) добавь опцию командной строки для добавления файла и кол-ва запусков в указанный конф. файл (либо в к.ф. по-умолчанию, если ничего не указано). С удалением справятся вручную
ничего личного, все от имени и во благо юзеров
А вообще - спасибо.. визуальный Барсик - сильная весчь)
dosim: есть еще пожелания к создателю скрипта?

-------
[FAQ] Как определить аппаратную конфигурацию компьютера и правильно задать вопрос
-------
В благодарность за помощь нажимаем ссылочку "Полезное сообщение" внизу этого самого сообщения (подробнее). Помните: админ конфеты НЕ ПЬЁТ ;)
-------
Говори, что думаешь и думай, что говоришь! (c) || МОЙ ShaddyR.at.UA/blog - Как поменять термопасту за 100+ баксов


Отправлено: 12:59, 08-07-2006 | #12


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


ShaddyR
Я боюсь, что Вы не совсем поняли, как это работает (или я сам не совсем понял).

1) сообщение о лимите выводится в сеанс, в котором запущен скрипт.
Конечно. Естественно. И я не знаю, а как же иначе-то?

Как я понял: Этот скрипт запускается при входе на сервер для каждого пользователя. Т.е. кто-то входит - у него запускается логон-скрипты, в том числе и этот. И для каждого, кто зашёл, действует _персональный_ лимит на количество блокнотов-калькуляторов. Не один на всех этот скрипт, а каждому - свой. Возможно, я не совсем вкурил механизм действия скрипта, но у меня нет терминал-севрера, к сожалению :-\

2) ессно, закрытие копии в сеансе другого пользователя также не производится, вне зависимости от прав юзера, под которым скрипт запущен.

И не должно, так как по замыслу (см. выше) скрипт не контролирует других пользователей, а лишь данного конкретного.

И кстати, вот какой момент. Закрытие сейчас производится _до_вывода_ сообщения "Вы превысили лимит". Т.е. пользователь запустил блокнот - скрип 1) проверил лимит, 2) _закрыл_блокнот, 3) сообщил о превышении лимита. Если поменять местами 2 и 3, пользователь может устроить затык скрипту (вообще-то, он и сейчас, наверное, сможет, при должном усердии).

---

По косметике:

1) переименуй конф-файл в .ini (с именем скрипта, но поиском и его поиском по умолчанию, если не задана командная строка)

Вроде не сложно, только несколько неоднозначностей. Где что лежит? Где (в какой папке) нужно искать конфиг?

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

Вот это - вообще нельзя, насколько я соображаю. Скрипт действует в своём "коконе". Чтобы кто-то смог сообщить ему об изменении политики партии ("следи, мол, ещё и за этим вот файлом"), этот кто-то должен... в общем, речь идёт о inter-process communications. (см тут, я слишком косноязык). А вот умеет ли wscript.exe делать такие штучки - я сомневаюсь.

Отправлено: 21:53, 08-07-2006 | #13


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать




hasherfrog я запустил этот скрипт, всё работает т.е. процесс считывает, при запуске выше лимта выходит сообщение "Вы запустили лишную копию программы " ок нажимаешь програмка закрывается, но пока ты ок не нажмёшь програмка работает. Посмотрите в чем проблема? Сделайте чтобы, сообщение выходил и процесс сразу убивал, т.е до нажатие ОК.

-------
OSZONE.NET


Отправлено: 08:48, 10-07-2006 | #14


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


dosim
Как
Цитата:
но пока ты ок не нажмёшь програмка работает
соотносится с
Цитата:
Закрытие сейчас производится _до_вывода_ сообщения "Вы превысили лимит".
?

Отправлено: 10:18, 10-07-2006 | #15


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


hasherfrog Нет, пока ОК не нажмешь программа не закрывается.

-------
OSZONE.NET


Отправлено: 12:30, 10-07-2006 | #16


Аватара для ShaddyR

Железных Дел Мастер


Moderator


Сообщения: 24526
Благодарности: 4498

Профиль | Сайт | Отправить PM | Цитировать


dosim: ты не прав. Нелимитная копия закрывается прежде сообщения, проверено на калькуляторах.
>
Цитата:
переименуй конф-файл в .ini (с именем скрипта, но поиском и его поиском по умолчанию, если не задана командная строка)
Вроде не сложно, только несколько неоднозначностей. Где что лежит? Где (в какой папке) нужно искать конфиг?
в папке запуска скрипта, конечно. Если не указан другой путь\имя файла конфигурации.
>
насчет терминала... мож, я переборщил, это действительно не нужно. Просто основная идея озвучена в первом сообщении, примерно таким образом:
Цитата:
Цель: Имея Z пользователей терминальных, и N лицензий на Office 2003, как на сервере ограничить количество загрузок приложений Office, не более N-ти одновременно?
Но, думаю, достаточно предложенного тобой скрипта.

Еще раз спасибо.

-------
[FAQ] Как определить аппаратную конфигурацию компьютера и правильно задать вопрос
-------
В благодарность за помощь нажимаем ссылочку "Полезное сообщение" внизу этого самого сообщения (подробнее). Помните: админ конфеты НЕ ПЬЁТ ;)
-------
Говори, что думаешь и думай, что говоришь! (c) || МОЙ ShaddyR.at.UA/blog - Как поменять термопасту за 100+ баксов


Отправлено: 13:27, 10-07-2006 | #17


Пользователь


Сообщения: 87
Благодарности: 0

Профиль | Отправить PM | Цитировать


всё работает

-------
OSZONE.NET


Отправлено: 13:57, 10-07-2006 | #18


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


ShaddyR
Давайте по мелочам доразберёмся. У меня нет терминального сервера, поэтому придётся спрашивать у Вас.

Если данный скрипт запустит администратор, пользователи, превысившие лимит, могут открыть блокноты-калькуляторы? Дело в том, что я (кажется) придумал, как сообщать именно контретному пользователю о том, что именно он превысил лимит. Причём "ступора" не будет (а сейчас он есть, возможен).
Уберите строку
Код: Выделить весь код
Wscript.Echo "Вы запустили лишнюю копию программы "&	objLatestProcess.TargetInstance.Name  _
							 & " - разрешенный лимит только " & thePsArray(PSMAXN, psn)
и проверьте, пожалуйста.

А там, может и до IPC дойдём (есть идея).

Отправлено: 14:06, 10-07-2006 | #19


Аватара для ShaddyR

Железных Дел Мастер


Moderator


Сообщения: 24526
Благодарности: 4498

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog: честно - не понял идеи. Сделал: ничего не выводит, молча убивает в сеансе, где запущен.

-------
[FAQ] Как определить аппаратную конфигурацию компьютера и правильно задать вопрос
-------
В благодарность за помощь нажимаем ссылочку "Полезное сообщение" внизу этого самого сообщения (подробнее). Помните: админ конфеты НЕ ПЬЁТ ;)
-------
Говори, что думаешь и думай, что говоришь! (c) || МОЙ ShaddyR.at.UA/blog - Как поменять термопасту за 100+ баксов


Отправлено: 15:20, 11-07-2006 | #20



Компьютерный форум OSzone.net » Серверные продукты Microsoft » Microsoft Windows NT/2000/2003 » [решено] Как ограничить количество запущенных копий приложения на терминальном сервере?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход