Ru-Board.club
← Вернуться в раздел «В помощь системному администратору»

» Автоматизация администрирования. Часть 2

Автор: YNY
Дата сообщения: 09.12.2009 08:22
strani
1) Все ключи в реестр, при инсталляции программ, которые устанавливаются от члена группы Администраторы, пишутся в HKLM!
2) По ходу я не смогу тебе помочь, т.к. мои понятия о профилях, в корне отличаются от твоих, удачи!
Автор: coolpunk
Дата сообщения: 09.12.2009 09:00
strani
На первый вопрос есть решение. Используй moveuser.exe из Administration Tools. Я конечно так не пробовал, но учетки с домена в домен таскал замечательно.
Автор: strani
Дата сообщения: 09.12.2009 09:53
YNY
Ответил в личку, так как, пожалуй, это будет флуд.

coolpunk
Насколько я понял, она не позволяет копировать профиль в DetaultUser. Хотя интересная утилитка иногда.
Автор: cL0N31
Дата сообщения: 10.12.2009 11:03
2. если надо 1 раз скопировать то я бы загрузился с какого-нибудь unix livecd и написал что-то типа

Код:
cp -vrf greatfile /mnt/windoze/Documents\ and \ Settings/*/Desktop/greatfile
Автор: strani
Дата сообщения: 10.12.2009 13:02
cL0N31
Теоретически да, но тогда для вопроса 2 возникает задача перебрать все существующие на машине профили, а для вопроса 3 еще сложнее - надо перебрать реестры всех существующих на машине профилей. Задача очень нетривиальная по решению, должно быть... Неужели не существует готовой утилиты?
Автор: cL0N31
Дата сообщения: 11.12.2009 06:21
в принципе оба вопроса идентичны...
ну слушай ты меня вынудил, спецом для тебя нарыл:

Код:
for /d %i in ("%SystemDrive%\Documents and Settings\*") do xcopy "%SystemDrive%\tmp" "%i\tmp\" /eh
Автор: YNY
Дата сообщения: 11.12.2009 11:20
strani
[more=вот]'Win32_UserAccount
'Win32_Group
'Win32_Account
'SystemAccount

strComputer = "."
dim WshShell
set WshShell = WScript.CreateObject("WScript.Shell")

Set objWMIService = GetObject( _
"winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery _
("Select * from Win32_UserAccount Where LocalAccount = True")
For Each objItem in colItems
    'if objItem.Name="X" then
'Wscript.Echo "Local Account: " & objItem.LocalAccount
Wscript.Echo "Name: " & objItem.Name
Wscript.Echo "Name: " & objItem.Name&"--"&"SID: " & objItem.SID
'Wscript.Echo "SID Type: " & objItem.SIDType
Wscript.Echo "Status: " & objItem.Status
'Wscript.Echo
    'end if
if (objItem.Status<>"Degraded" ) then
'способ №1 с наличием ограничений по записи в реестр типа данных
' ниже, дляпримера, пишем в HKEY_CURRENT_USER

'    WshShell.RegWrite "HKCU\Software\ACME\FortuneTeller\", 1, "REG_BINARY"
'тут пишем в сид локольного пользователя
'WshShell.RegWrite "HKU\" & objItem.SID & "\Software\ACME\FortuneTeller\", 1, "REG_BINARY"

'способ №2 -- без ограничений по записи в реестр типа данных
'reg add имя_раздела [/v имя_записи|/ve] [/t тип_данных] [/s разделитель] [/d значение] [/f]
'ниже пример от барабана кот тебе надо самому редактировать )

WshShell.Run "cmd /k echo " & " reg add HKU\"& objItem.SID & "\MyAPP"& " /v KeyMyApp1 /t REG_DWORD /d 125756"
end if    
Next

[/more]тебе часть рыбы с определением локальных пользователей и их SID-ов и функциями записи в реестр
Автор: strani
Дата сообщения: 14.01.2010 19:15
Реализовал я то, что хотел на bat-файлах. Сделал максимально универсально.
Хорошо, если кто-то прокомментирует и улучшит...

http://strani2005.narod.ru/Template.zip - это универсальный шаблон
http://strani2005.narod.ru/WinCom.zip - это пример установки настроек для Total Commander.

Если необходимо что-то менять, то:
1) в файле Computers_List.txt пишем названия компьютеров, на которых удаленно будет выполняться установка (имя каждого компьютера в отдельной строке);
2) в файле !Run_before.cmd пишем команды, которые удаленно будут выполняться перед началом установки;
3) в файле !Run_after.cmd пишем команды, которые удаленно будут выполняться после окончания установки;
4) в файле Deleted_Files\Files.txt пишем полные пути к файлам, которые необходимо удалить (по одному файлу в каждой строке, без кавычек). Если ничего удалять не нужно, то файл Deleted_Files\Files.txt удаляем;
5) в папке Reg_Files_Machine помещаем reg-файлы (можно не один), которые будут импортированы в систему (файлы в обычной форме записи);
6) в папке Reg_Files_User помещаем reg-файлы (можно не один), которые будут импортированы в систему и в личные профили (файлы в обычной форме записи);
7) в папку Files_All_Users помещаем подпапки с файлами, которые необходимо скопировать в общий профиль (все пути относительные);
8) в папку Files_User помещаем подпапки с файлами, которые необходимо скопировать в личные профили (все пути относительные);
9) в папку Files_Machine помещаем подпапки с файлами, которые необходимо скопировать на логические диски C и D (все пути абсолютные). Файлы для папок Windows и Program Files помещаем в отдельные соответствующие папки (в этом случае пути относительные, при этом неважно реальное расположение этих папок);
10) если необходимо установить программу, которая не требует вмешательства при установке, помещаем ее в набор как файл с именем install.exe. При этом вначале выполняется install.exe, а затем install.cmd;
11) во время установки принудительно завершается работа любого пользователя, работающего на удаленном компьютере (но только если это необходимо, то есть для применения личных reg-файлов с личными настройками). Если это мешает, необходимо закомментировать строку с psshutdown в файле Remote_Install.cmd.

После вышеперечисленного необходимо запустить файл Run_me!!.cmd.

Все это, по-моему, очень пригодится для удаленной установки настроек и программ в сети без домена. Да и с доменом может пригодиться.
Автор: cL0N31
Дата сообщения: 15.01.2010 10:16
молодез (не тестил правдо)... возник вопрос: для psexec какие порты открывать?
Автор: YNY
Дата сообщения: 16.01.2010 10:00
1

Добавлено:
strani
если честно , то , ИМХО, геморная реализация, т.к. я привык использовать только 1 файл-скрипт, а не плодить кучу
Автор: strani
Дата сообщения: 16.01.2010 15:34
cL0N31
Этого я не знаю...

YNY
Возможно, можно было бы все свести к одному-двум файлам (я говорю про bat и cmd-файлы).
Я разбил, потому что: 1) можно выполнить отдельно определенные файлы; 2) иначе не было бы универсальности; 3) легче править, файлы более простые.
В большинстве случаев достаточно положить нужные файлы в нужные папки и запустить скрипт. Но в целом у каждого свои привычки

Template.zip повторно обновлен:
1) теперь вместо одного лога создаются два (разного назначения);
2) файл install.cmd будет обрабатывать только непустые каталоги;
3) добавил файл psshutdown.exe;
4) производится отключение пользователя только если это необходимо;
5) файлы в каталоги Windows и Program Files теперь копируются через переменные окружения (то есть не важно реальное расположение этих каталогов);
6) уменьшил количество скриптов.
Автор: AndreySh
Дата сообщения: 17.01.2010 12:20
Помогите решить проблему резервного копирования баз 1С 7.7
Имеем 2000 сервер (вечером выключается).
Необходимо написать скрипт, которыей выполняется (желательно с правами администратора) который при завершении работы ваполнял проверку есть ли открытые сессии 1С и в случае их отсутствия далал бакап баз 1С-ки.
ЗЫ При включении сервер загружается с правами доступа обычного пользователя. Пользователи ходят на сервер через терминал.
Спасибо.
Автор: abasov
Дата сообщения: 18.01.2010 12:51
Можно это перекроить на винконсоль?


Код: find -not -empty -type f -printf "%s\n" | sort -rn | uniq -d | xargs -I{} -n1 find -type f -size {}c -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=separate
Автор: Oldster
Дата сообщения: 18.01.2010 19:12
AndreySh
План примерно такой:
0) Все действия можно делать из Шедуллера с нужными правами.
1) Запускается скрипт на проверку запущенных процессов 1С (1Cv77.exe или 1Cv77s.exe) Если процессы найдены - убиваем. Примерно [more=так]
var WMIService = GetObject('winmgmts:' + '{impersonationLevel=impersonate}!\\\\.\\root\\cimv2');
var processList = WMIService.ExecQuery("Select * from Win32_Process Where Name = '1cv7s.exe'");
var OUT = "";
path_log = "1C_Log.txt";
d = new Date();
OUT += "\n"+ d.toLocaleDateString() + " " + d.toLocaleTimeString() + " ------Начало сессии------\n";
OUT += "\nНайден(о) " + processList.Count + " процесс(а,ов), поиск виновников:\n\n";

var processEnumerator = new Enumerator(processList);

while (!processEnumerator.atEnd()) {
    
    var x = processEnumerator.item();
    var ometh = x.Methods_.Item("GetOwner");
    var xout = x.ExecMethod_(ometh.Name, null);
    var user = xout.User;
    var domain = xout.Domain;
    
    OUT += user + "\n";

    processEnumerator.item().Terminate();
    
    processEnumerator.moveNext();
}

OUT += "\n"+ d.toLocaleDateString() + " " + d.toLocaleTimeString() + " ------Конец сессии-------\n";
//WScript.Echo(OUT);

//Запись лога
FSO = WScript.CreateObject("Scripting.FileSystemObject");
log = FSO.OpenTextFile(path_log,8,true);
log.WriteLine (OUT);
log.Close();
[/more] Или [more=так]
rem Убивает терм. сессию для юзера "uncle"
For /f "tokens=3" %%i in ('QWinSta ^| Find /i "uncle"') Do Echo y | RWinSta %%i
[/more]
2) Запускаем сам процесс архивирования (вариантов - море), мне по душе - WinRAR и полную копию всей директории.
3) Выключаем сервер. (shutdown /?)
Автор: AndreySh
Дата сообщения: 18.01.2010 19:45
Oldster
0) Как привязать это к выключению (не перезагрузке). Как определить событие...
Спасибо.
Автор: SuperHamster
Дата сообщения: 18.01.2010 20:12
В принципе было нет, для всех обладателей PPP, соединений, простенький батник на переподключение после разрыва связи:

start
rasdial (имя подключения) (Логин) (Пороль)
ping (несуществующий ип в сети, либо какой-ниь ип в инете) -n 60

Раз в определенный интервал времени, утилитка будет пинговать несуществубщий узел и проверять подключение...

Сейчас ищу какую-нибудь замену этому.
Автор: GlebisZ
Дата сообщения: 19.01.2010 08:06
Блин, весь инет и этот форум обыскал, ответа не нашёл.
Мне нужно по ярлыку запустить почтовый клиент по умолчанию (MS Outlook или Outlook Express) с прикреплением файла (с одинаковым именем но каждый раз разный), определённым адресатом и темой, что бы пользователь мог отредактировать и отослать документ сам вручную. Опробованные реализации:
1) бланк Out Exp не подходит - файл должен быть разный каждый раз последней версии.
2) ярлык mailto:mail@mail.ru?atach=C:\filetosent.zip&subject=отчёт - никак не поддерживает mapi функцию attach.
3) параметры запуска MS Outlook
"...Outlook.exe" /m mail@mail.ru /a "C:\filetosent.zip"
совместно не работает, либо указывать аттач, либо адресата. Как указать тему вообще в хелпе не нашёл.
4) сторонние утилиты posti и т.д. крайне не желательны. Сторонние почтовые программы (как the Bat!) вообще запрещенны. Exchenge сервера нет и не будет в помине.
5) все найденные реализации на vbs просто автоматом отправляют письма.

Ребяты, помогите, а то я задолбался всё это отправлять вручную...
Автор: YNY
Дата сообщения: 19.01.2010 09:48
strani
смотрел твои примеры и чет не догнал зачем ты завершаешь сеанс пользователя + от имени кого тогда изменения вносишь, если админа то как все это потом стыкуется с др пользователями тыж ся в грудь бил что они все разные?
GlebisZ
тут (на стр ранее) есть скрипт посылающий письма, что тебе мешает сначала отредактировать вложение, а потом запустить скрипт, хотя если его все равно пользователи редактят, то на* тебе ваще скрипт (отправлять по утлуку мона кликом пр кнопки по файлу на прим на раб столе)?


Добавлено:
SuperHamster расдиал и так восстанавливает соединение при именно разрыве связи, если покопаешь реестр, то можешь время настроить.
Автор: GlebisZ
Дата сообщения: 19.01.2010 10:59
Вложение - это ежедневный отчёт, сформированный гл.бухом. Мои юзвери настолько "деревянные", что не могут запомнить последовательность ПКМ на отчёте - выбрать получателя - ввести тему - прикрепить вложение - отправить.
Поэтому у меня есть выбор - либо отправлять отчёты по почте ежедневно самому, либо сделать "картинку на экране", по щелчке на которой появляется письмо с прикреплённым сегодняшним отчётом, уже введённым адресатом, где пользователю останется лишь поменять текущую дату в теме и нажать "отправить".
Основная проблема в том, что <параноидально> нельзя устанавливать сторонние приложения, на кот. нет лицензии, даже если это freeware.
Осилил последние 10 страниц этой темы, про почту ничего не нашёл. Ни в гугле, ни в
в поиске по руборду нужного скрипта тоже могу.
А до того как полностью допру до понимания MAPI и VBS, я отправлю не одну сотню отчётов и ни разу не свалю домой пораньше .
Автор: sarti
Дата сообщения: 19.01.2010 12:37
GlebisZ, спроси там у тамошних гуру, должны помочь. А вообще сочувствую, тяжело работать с человеческой глупостью, особенно когда её обладатель даже не стремится её преодолеть.
Автор: GlebisZ
Дата сообщения: 19.01.2010 12:57
sarti
Спасибо за сочувствие. Долбанный кризис заставил работать в такой конторе...

AndreySh
Теоретически можно назначить на службу (например) "Удалённый вызов процедур RPC" - "восстановление" - "первый сбой" - "запуск программы" твой Batник, и при этом отключить автоматическое завершение программ при выключении. Но как это будет работать не знаю. Логично, как писал Oldster, делать выключение из батника, а не запускать батник при выключении...
Автор: YNY
Дата сообщения: 19.01.2010 13:50
GlebisZ
вот прямая ссылка на вопрос
Автор: strani
Дата сообщения: 19.01.2010 20:38
YNY

Цитата:
смотрел твои примеры и чет не догнал зачем ты завершаешь сеанс пользователя + от имени кого тогда изменения вносишь, если админа то как все это потом стыкуется с др пользователями тыж ся в грудь бил что они все разные?

Все делается под системной учетной записью. В последней версии я сделал так:

if exist "Reg_Files_User\nul" (
echo *** Завершаем сеанс работы пользователя на всех компьютерах ***
psshutdown -o -f @Computers_List.txt
)
Это строки из файла Remote_Install.cmd. То есть завершаем работу пользователя только в том случае, если в папке Reg_Files_User содержатся reg-файлы.

Ниже идут строки из файла Install.cmd.

rem *** Корректируем reg-файлы ***
if exist "%~dp0Reg_Files_User\nul" (
attrib -r "%~dp0Reg_Files_User\*.*" /s
for /f "tokens=*" %%F in ('dir "%~dp0Reg_Files_User" /a:-d /b /s') do (
gsar.exe -s[HKEY_CURRENT_USER\ -r[HKEY_LOCAL_MACHINE\Tmp\ -i -o "%%F"
)
)
То есть делаем из обычных reg-файлов с личными настройками reg-файлы, которые можно временно импортировать в системный реестр

rem *** Импорт личных и общих настроек в реестр всех пользователей, кроме текущего ***
if exist "%~dp0Reg_Files_User\nul" (
for /f "tokens=*" %%U in (!users!.txt) do (
reg.exe load HKEY_LOCAL_MACHINE\Tmp "%AllUsersProfile%\..\%%U\NTUSER.DAT"
То есть во временную ветку реестра загрузили профиль какого-то пользователя
if errorlevel 1 (
rem *** Ошибка при загрузке реестра пользователя ***
Профиль пользователя, который залогинен, нельзя временно загрузить в системный реестр
) else (
for /f "tokens=*" %%F in ('dir "%~dp0Reg_Files_User" /a:-d /b /s') do regedit.exe /s "%%F"
То есть во временную ветку реестра импортируем ранее модифицированные reg-файлы с личными настройками
)
reg.exe unload HKEY_LOCAL_MACHINE\Tmp
То есть из временной ветки реестра выгружаем профиль пользователя
)
)

rem *** Корректируем reg-файлы обратно ***
if exist "%~dp0Reg_Files_User\nul" (
for /f "tokens=*" %%F in ('dir "%~dp0Reg_Files_User" /a:-d /b /s') do (
gsar.exe -s[HKEY_LOCAL_MACHINE\Tmp\ -r[HKEY_CURRENT_USER\ -i -o "%%F"
)
)
То есть делаем из временных reg-файлов обычные. Это так, на всякий случай.

ВНИМАНИЕ!!! Обнаружил принципиальную ошибку. Во всех файлах необходимо заменить "\nul" на "\", иначе скрипты не работают! Архив обновил.

Время 16:22. Обнаружена ошибка при проверке необходимости завершения работы пользователя. Исправлен файл Remote_Install.cmd! Архив обновил.
Автор: Oldster
Дата сообщения: 21.01.2010 20:26
AndreySh

Цитата:
Как определить событие

Что то я не догоняю... кто сервак выключает? Если это юзеер, то на выключение сервака у него должны быть права, тогда делай батник, который все сделает, а потом выкл. сервак, и покажи юзверу что теперь выкл. сервер надо так (запуском батника). Если это по расписанию - то тот же батник, но в шедуллер. Или есть еще какие то варианты у вас?

Добавлено:
GlebisZ
    //Этот скрипт предназначен для отправки e-mail с компьютера,
    //на котором не установлен SMTP-протокол
    d = new Date();
    
    objEmail = WScript.CreateObject("CDO.Message");
    objEmail.From = "robot@xxx.ru";
    objEmail.To = "admin@xxx.ru";
    objEmail.Subject = "Отчет ..... за " + d.toLocaleDateString();
    objEmail.Textbody = msg;
    objEmail.AddAttachment("e:\\Users\\Log_AD.txt");
    
    objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2;
    objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smpt.mail.ru"
    objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25;
    objEmail.Configuration.Fields.Update();
    
    objEmail.Send();
Автор: BumerangII
Дата сообщения: 28.01.2010 12:41
Подскажите, как реализовать
ниже приведенный код не работает
Код: strVar=WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
if srtVar = S?????-TCS then
    set userVar = "test1"
    set passVar = "xxxxx"
if srtVar = K?????-KST then
    set userVar = "test2"
    set passVar = "yyyyyy"
Автор: el_verdugo
Дата сообщения: 29.01.2010 02:23
BumerangII
Я так понял, ты хочешь обрабатывать маски имен компьютеров.?.
Чтобы сильно не мудрить, можно сделать так:
Код: strVar=WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
if (LCase(Left(strVar, 1)) = "s" And LCase(Right(strVar, 4)) = "-tcs") then
set userVar = "test1"
set passVar = "xxxxx"
Elseif (LCase(Left(strVar, 1)) = "k" And LCase(Right(strVar, 4)) = "-kst") then
set userVar = "test2"
set passVar = "yyyyyy"
Else
'
End If
Автор: BumerangII
Дата сообщения: 03.02.2010 11:19
el_verdugo
спасибо, работает
толко пришлось намного поправить, а то ругалось

теперь вот так

Код: strVar=WshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
if (LCase(Left(strVar, 1)) = "s" And LCase(Right(strVar, 4)) = "-tcs") then
userVar = "test1"
passVar = "xxxxx"
Elseif (LCase(Left(strVar, 1)) = "k" And LCase(Right(strVar, 4)) = "-kst") then
userVar = "test2"
passVar = "yyyyyy"
Else
'
End If
Автор: yazzi
Дата сообщения: 04.02.2010 13:14
Добрый день, подскажите как с помощью vbs можно узнать язык операционной системы?
Автор: niichavo
Дата сообщения: 04.02.2010 21:49
yazzi

Код: strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
For Each objItem In colItems
WScript.Echo "Country Code: " & objItem.CountryCode
WScript.Echo "Locale: " & objItem.Locale
WScript.Echo "OS Language: " & objItem.OSLanguage
WScript.Echo "Code Set: " & objItem.CodeSet
Next
Автор: sigmar
Дата сообщения: 26.02.2010 16:17
Есть вопрос! Есть домен с AD. В домене машини с XP, Vista и 7. Надо создать логон скрипт, который бы проверял наличие в корне профиля пользователя наличия папки с одним файлом и если папки нет или файл не соответствует эталону, то создавал бы папку и копировал туда эталонный файл. Что мне надо сделать, на чем написать этот скрипт? Если вопрос уже обсуждался - дайте ссылку на обсуждение. Заранее спасибо!

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

Предыдущая тема: BackUp Win2003Serer


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.