Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Установить обои рабочего стола в домене через GPO (http://forum.oszone.net/showthread.php?t=283006)

PowerZ 01-06-2014 20:52 2358634

Установить обои рабочего стола в домене через GPO
 
Нужен скрипт, который запускается через GPO, и выполняет следующие действия:

1. Определяет разрешение экрана машины в домене (клиентские ОС Windows 7/8).

2. Выполняет проверку: существует ли папка «Corp» в "%WinDir%\Web\Wallpaper\". Если нет, то создает папку.

3. В зависимости от разрешения экрана, копирует заранее подготовленный "wallpaper" из сетевой шары "\\fileserver\wallpaper\xxxx.bmp" на локальную машину в "%WinDir%\Web\Wallpaper\Corp\"
Файлы 1024x768.bmp; 1280x1024.bmp; 1600x900.bmp и т.д.

4. Выполняет применение текущего wallpaper (устраивает даже при следующей перезагрузке).

5. В случае изменения разрешения экрана, операция при следующем входе в систему повторяется под новое разрешение экрана.

6. В случае недоступности сетевой шары - сохраняются предыдущие успешно установленные параметры, и чтобы не выводились ошибки отработки скрипта и т.д.

На просторах интернета нашел немало готовых скриптов, но они выполняют только часть операций.
Задача для меня не совсем простая, опыта написания скриптов – нет.

Так предполагаю, что нужно будет два раздельных скрипта:
1 – выполняется через GPO на уровне компьютера, выполняет определение разрешения экрана и выполняет копирование из сети (связанно из-за того, что под пользователем без прав локального администратора, не получится скопировать в "%WinDir%\Web\Wallpapaer\Corp\".

2 – выполняется через GPO на уровне пользователя, и выполняет уже применение существующей локальной обоины.

Помогите пожалуйста, в решение данной задачи.

dinovasya@vk 14-07-2014 18:39 2376428

хмм. Интересная задача, не решена до сих пор? сеййчас тоже поищу в просторах интернета.. Поделись если есть готовое решение..

PowerZ 15-07-2014 18:24 2376879

Задача решена, но частично.

Пока нет решения по всем выше описанным операциям, но есть скрипт, который отрабатывает за исключением нескольких пунктов.

В моем варианте, заранее подготовленные обои лежат в \\domain.local\sysvol\domain.local\Wallpapers\
В формате Corp1024x768.bmp; Corp1366x768.bmp

Сам скрипт запускается через GPO, на уровне пользователя.

Wallpaper.vbs
читать дальше »

Код:

strComputer = "."

 Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

 Set colItems = objWMIService.ExecQuery _
 ("Select * From Win32_DesktopMonitor")

 For Each objItem in colItems
 
 dim wshShell
 
 sWallPaper = "\\domain.local\SYSVOL\domain.local\Wallpapers\Corp" _
 & objItem.ScreenWidth & "x" & objItem.ScreenHeight & ".bmp"
 
 'msgbox (sWallPaper)

 Set wshShell = WScript.CreateObject("WScript.Shell")

 Set oShell = CreateObject("WScript.Shell")

 Set oFSO = CreateObject("Scripting.FileSystemObject")

 WinDir = oFSO.GetSpecialFolder(0)

 If oFSO.FileExists(sWallPaper) Then

 oShell.RegWrite "HKCU\Control Panel\Desktop\Wallpaper", sWallPaper
 oShell.RegWrite "HKCU\Control Panel\Desktop\TileWallpaper", 0

 oShell.Run "%windir%\System32\RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters", 1, True
 Else
 
 msgbox ("Сообщите системному администратору, об нестандартном разрешение экрана: " _
 & objItem.ScreenWidth & "x" & objItem.ScreenHeight)

 End If

 If objItem.ScreenHeight >0 Then
 Exit For
 End If
 Next


dinovasya@vk 15-07-2014 18:54 2376896

Вчера пытался настроить через GPO, но в итоге оставил без изменений, т.к. в моей доменной сети в основном компы на windows7 и десяток компов на windows XP, боюсь что получится что-то не то если подсуну стили для 7-ки, как их воспримут машины на XP? ведь правило применится ко всем компам..


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

Машины на XP и 7-ке наверно все воспримут нормально обои?
А как они сами себе каждая машина выберет нужное разрешение картинки?

PowerZ 15-07-2014 21:23 2376987

Цитата:

Цитата dinovasya@vk
Вчера пытался настроить через GPO, но в итоге оставил без изменений, т.к. в моей доменной сети в основном компы на windows7 и десяток компов на windows XP, боюсь что получится что-то не то если подсуну стили для 7-ки, как их воспримут машины на XP? ведь правило применится ко всем компам.. »

На счет стилей особо не подскажу, уже был не очень удачный опыт через GPO… это было очень давно.
А если крутить стили, или что-либо другое скриптами через GPO, то можно предварительно также через скрипт, сделать определение версии ОС, а дальше уже использовать раздельные скрипты для разного типа ОС.

Цитата:

Цитата dinovasya@vk
Думаю приятно будет всем, когда с утра загрузятся на всех машинах обои, которые что-то обозначают именно на нашем производстве. »

Особенно еще для счастья запретить ручную смену обоев, также через GPO.

Цитата:

Цитата dinovasya@vk
Машины на XP и 7-ке наверно все воспримут нормально обои?
А как они сами себе каждая машина выберет нужное разрешение картинки? »

Скрипт проверен через GPO (домен 2008R2) на XP/VISTA/7/8/2008R2 – везде отрабатывает нормально.

Ну так это одна из основных задач данного скрипта, определение текущего разрешения экрана objItem.ScreenWidth и objItem.ScreenHeight
Главное предварительно настряпать обои под все действующие разрешения.
А если найдутся уникумы в сети с нестандартным разрешением, то им будет назойливо каждый раз при загрузке сообщение выдаваться "Сообщите системному администратору, об нестандартном разрешение экрана: 1600x1200" к примеру.

dinovasya@vk 16-07-2014 08:01 2377115

Очень доступно, подробно.
Тут и у новичка вопросов больше не возникнет. Спасибо!
Со стилями баловаться не буду, а вот обои через фотошоп сам наделаю под разное разрешение- дело 5-ти минут..

Iska 16-07-2014 10:29 2377146

Цитата:

Цитата PowerZ
Главное предварительно настряпать обои под все действующие разрешения.
А если найдутся уникумы в сети с нестандартным разрешением, то им будет назойливо каждый раз при загрузке сообщение выдаваться "Сообщите системному администратору, об нестандартном разрешение экрана: 1600x1200" к примеру. »

Или иметь одну большую картинку, из которой уже готовить подходящую под конкретное разрешение и пропорции «на месте», например, посредством WIA.

dinovasya@vk 16-07-2014 11:34 2377175

Цитата:

Цитата Iska
Или иметь одну большую картинку, из которой уже готовить подходящую под конкретное разрешение и пропорции «на месте», например, посредством WIA. »

Научи..

Iska 16-07-2014 13:58 2377224

Цитата:

Цитата dinovasya@vk
Научи.. »

Попробуйте так:
читать дальше »
Код:

Option Explicit

Const wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
Const ssfLOCALAPPDATA = &H1C


Dim strDomainPath2WallpaperFile

Dim objFSO

Dim strLocalPath2WallpaperFolder
Dim strLocalPath2WallpaperFile

Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim objImageFile


strDomainPath2WallpaperFile = "C:\Мои проекты\Wallpapers\Source2.jpg"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If Not objFSO.FileExists(strDomainPath2WallpaperFile) Then
        WScript.Echo "Can't find wallpaper's source file [" & strDomainPath2WallpaperFile & "]."
        WScript.Quit 1
End If

strLocalPath2WallpaperFolder = objFSO.BuildPath(WScript.CreateObject("Shell.Application").NameSpace(ssfLOCALAPPDATA).self.Path, "Microsoft")

If Not objFSO.FolderExists(strLocalPath2WallpaperFolder) Then
        WScript.Echo "Can't find local path [" & strLocalPath2WallpaperFolder & "] to wallpapers."
        WScript.Quit 2
End If

Set collSWbemObjectSet = WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery("SELECT ScreenWidth, ScreenHeight FROM Win32_DesktopMonitor")

If collSWbemObjectSet.Count > 0 Then
        For Each objSWbemObjectEx In collSWbemObjectSet
                Set objImageFile    = WScript.CreateObject("WIA.ImageFile")
               
                objImageFile.LoadFile strDomainPath2WallpaperFile
               
                With WScript.CreateObject("WIA.ImageProcess")
                        .Filters.Add .FilterInfos("Scale").FilterID
                       
                        With .Filters.Item(1).Properties
                                .Item("MaximumWidth")  = objSWbemObjectEx.ScreenWidth
                                .Item("MaximumHeight") = objSWbemObjectEx.ScreenHeight
                        End With
                       
                        .Filters.Add .FilterInfos("Convert").FilterID
                        .Filters.Item(2).Properties.Item("FormatID").Value = wiaFormatBMP
                       
                        Set objImageFile = .Apply(objImageFile)
                End With
               
                strLocalPath2WallpaperFile = objFSO.BuildPath(strLocalPath2WallpaperFolder, objFSO.GetBaseName(strDomainPath2WallpaperFile) & ".bmp")
               
                If objFSO.FileExists(strLocalPath2WallpaperFile) Then
                        objFSO.DeleteFile strLocalPath2WallpaperFile, True
                End If
               
                objImageFile.SaveFile strLocalPath2WallpaperFile
               
                With WScript.CreateObject("WScript.Shell")
                        .RegWrite "HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper", strLocalPath2WallpaperFile
                        .Run """%SystemRoot%\System32\RUNDLL32.EXE"" user32.dll,UpdatePerUserSystemParameters", 0, True
                End With
               
                Set objImageFile    = Nothing
               
                Exit For
        Next
Else
        WScript.Echo "Can't find any DesktopMonitor."
        WScript.Quit 3
End If

Set objFSO = Nothing

WScript.Quit 0


P.S. На «UpdatePerUserSystemParameters» я бы не особенно рассчитывал — работает от станции к станции, не угадаешь.
P.P.S. Конечно, можно масштабировать не только по большей стороне изображения как сейчас (при разнице в соотношении сторон исходного изображения и текущего разрешения (например, изображение — 16:9, а монитор — 4:3 сверху/снизу или справа/слева могут оставаться поля, заполненные фоновым цветом), но и вычислять кроп-фактор и обрезать изображение, подгоняя его соотношение под текущее разрешение.


Время: 10:59.

Время: 10:59.
© OSzone.net 2001-