вторник, 6 марта 2012 г.

Как системные администраторы поздравляют с 8 марта

Как "красиво" поздравить ваших сотрудниц с праздником весны. Начальник поставил задачу и на ум пришло следующее решение: Поставить на рабочий стол тематическую картинку и поздравления всем пользователям женского пола. Как это сделать далее.

Реализовывать это будем посредством утилитки от Microsoft Bginfo.exe. Она позволяет выбирать изображение на рабочий стол и лепить текст поверх картинки.

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

В bginfo создаем новый файл настройки вида:

Где <random> будет наше выбранное поздравление.
Для создания поля <random> жмем custom... И выбираем vbs файл формирования поздравлений.

Пример файла:


Randomize()
randomNumber=Int(5 * Rnd())
'MsgBox randomNumber


'randomNumber = 0


Select Case randomNumber
Case 0
text = "Желаем вам всего, чем жизнь богата:"& vbCrLf _
    &"Здоровья, счастья, долгих лет,"& vbCrLf _
    &"Пусть этот праздник — день 8 Марта -"& vbCrLf _
    &"В душе оставит добрый след!"& vbCrLf


Case 1
text = "Желаю счастья и любви."& vbCrLf _
    &"Они дороже всех подарков."& vbCrLf _
    &"И пусть все сбудутся мечты "& vbCrLf _
    &"В прекрасный день — 8 МАРТА!"& vbCrLf


Case 2
text = "Желаем, чтоб радости было много,"& vbCrLf _
    &"Чтоб радость верной спутницей была, "& vbCrLf _
    &"И чтоб всегда на жизненной дороге "& vbCrLf _
    &"Тебе хватало ласки и тепла."& vbCrLf


Case 3
text = "Пусть сердце в такт стучит капели, "& vbCrLf _
    &"Пусть канут в прошлое метели, "& vbCrLf _
    &"И пусть в весенних хороводах "& vbCrLf _
    &"Забудет сердце о невзгодах."& vbCrLf


Case 4
text = "Спасибо вам за вашу доброту!"& vbCrLf _
    &"За ваше белорусское терпенье,"& vbCrLf _
    &"За лишний нерабочий день в году,"& vbCrLf _
    &"За день обычный, ставший воскресеньем!"& vbCrLf
End Select
echo text
'MsgBox text

Были небольшие проблемы отображения строк, поэтому формирование четверостишия такое сложное. Решать проблему не было времени - оставил как есть.
Нажав на Background можно выбрать красивую праздничную картинку и настроить ее положение.
Посмотрим на результат выполнив: C:\Windows\temp\Bginfo.exe C:\Windows\temp\pozdr.bgi /timer:0 /NOLICPROMPT
Все нужные файлики я отлаживаю в директории C:\Windows\temp\ для дальнейшего распространения в MS AD.

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

У нас на предприятии домен MS Active Directory 2003. Все пользователи имеют логины, которые идентичны табельным номерам сотрудников. Не составляет труда подключится к базе сотрудников и вытащить ФИО и Департамент, для отображения в поздравлении.
Если у вас логины создавались сумбурно, можно использовать промежуточную таблицу для получения личной информации. 


name1                 name2

user99                 4534
user65                 4534


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


Немаловажный фактор кого поздравлять. Естественно если ваш начальник мужского пола и ему на рабочий стол упадут цветочки, будет не очень хорошо. Есть возможность выбрать пол пользователя из вашей базы данных сотрудников и поместить их в отдельную таблицу.
При выполнении скрипта проверяем наличие пользователя в таблице сотрудниц:
Вот пример такого скрипта. Строку соединения, наименование полей и пути к файловым серверам должны быть ваши.

8marta.vbs
Dim FSO
Dim WshShell

Set FSO = CreateObject("scripting.filesystemobject") 'Объявляем объектную переменную
Set WshShell = WScript.CreateObject("WScript.Shell") 'Объявляем объектную переменную

'declare the variables 
Dim Connection
Dim ConnString
Dim Recordset
Dim SQL

'define the connection string, specify database driver
ConnString= "Driver=SQL Server;SERVER=SERVER;Database=kadr;Trusted_Connection=Yes"  

'declare the SQL statement that will query the database
Set objNet = CreateObject("WScript.NetWork") 

'SQL = "SELECT fio, nkCex  FROM marta where tn="+objNet.UserName

'create an instance of the ADO connection and recordset objects
Set Connection = CreateObject("ADODB.Connection")
Set Recordset = CreateObject("ADODB.Recordset")

'Open the connection to the database

Connection.Open ConnString

'Open the recordset object executing the SQL statement and return records 
Recordset.Open SQL,Connection

'first of all determine whether there are any records 
If Recordset.EOF Then 
Else 
'if there are records then loop through the fields 
Do While NOT Recordset.Eof   
'Recordset("fio")


If FSO.FolderExists ("C:\Windows\TEMP")=False Then 'Проверяем папку. Если нет то создаем и копируем в нее файл на исполнение.
FSO.CreateFolder("C:\Windows\TEMP")
FSO.CopyFile "\\FS1\Releases\BgInfo\Bginfo.exe", "C:\Windows\TEMP\Bginfo.exe" 'здесь нужно поправить путь
Call RunBgi
Else
If FSO.FileExists("C:\Windows\TEMP\Bginfo.exe")=true Then 'Проверка файла. Вдруг кто TEMP почистил
Call RunBgi
Else
FSO.CopyFile "\\FS1\Releases\BgInfo\Bginfo.exe", "C:\Windows\temp\Bginfo.exe"
Call RunBgi
End If
End If



Recordset.MoveNext     
Loop
End If


Sub RunBgi ()
FSO.CopyFile "\\FS1\Releases\BgInfo\pozdr.bgi", "C:\Windows\temp\pozdr.bgi" 'копируем предварительно созданный файл конфигурации.
FSO.CopyFile "\\FS1\Releases\BgInfo\getname.vbs", "C:\Windows\temp\getname.vbs" 'копируем предварительно созданный файл scr.
FSO.CopyFile "\\FS1\Releases\BgInfo\getndep.vbs", "C:\Windows\temp\getndep.vbs" 'копируем предварительно созданный файл scr.
FSO.CopyFile "\\FS1\Releases\BgInfo\random.vbs", "C:\Windows\temp\random.vbs" 'копируем предварительно созданный файл scr.
FSO.CopyFile "\\FS1\Releases\BgInfo\bg8m.jpg", "C:\Windows\temp\bg.jpg" 'копируем предварительно созданный файл bg.
WshShell.Run "C:\Windows\temp\Bginfo.exe C:\Windows\temp\pozdr.bgi /timer:0 /NOLICPROMPT"
End Sub



'close the connection and recordset objects to free up resources
Recordset.Close
Set Recordset=nothing
Connection.Close
Set Connection=nothing

Для вывода ФИО сотрудника, делаем custom поле (по примеру Random) и получаем ФИО из вашей базы.

'declare the variables 
Dim Connection
Dim ConnString
Dim Recordset
Dim SQL

'define the connection string, specify database driver
ConnString= "Driver=SQL Server;SERVER=SERVER;Database=kadr;Trusted_Connection=Yes"  

'declare the SQL statement that will query the database
Set objNet = CreateObject("WScript.NetWork") 

SQL = "SELECT  fio FROM marta where tn="+objNet.UserName

'create an instance of the ADO connection and recordset objects
Set Connection = CreateObject("ADODB.Connection")
Set Recordset = CreateObject("ADODB.Recordset")

'Open the connection to the database

Connection.Open ConnString

'Open the recordset object executing the SQL statement and return records 
Recordset.Open SQL,Connection

'first of all determine whether there are any records 
If Recordset.EOF Then 
Else 
'if there are records then loop through the fields 
Do While NOT Recordset.Eof   
Echo Recordset("fio")
Recordset.MoveNext     
Loop
End If

'close the connection and recordset objects to free up resources
Recordset.Close
Set Recordset=nothing
Connection.Close
Set Connection=nothing

Все делалось с MS SQL, но я думаю, не составит труда обратится к другим источникам данных.


Если у вас MS AD создаем групповую политику и при Входе пользователя выполняем данный скрипт 8marta.vbs.

Все. Извините что несколько хаотично. Тороплюсь, праздник не за горами.