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

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

Автор: firsteducation
Дата сообщения: 23.10.2010 12:03
YNY ты писал
Цитата:
Читай справку по cmd!!! Если в "главном" бат файле вызвать cmd /c script1.bat, а затем script2.bat, то второй запустится только после того, как завершит работу первый!
Еще мона в начале скрипта проверять наличие файла и если его нет, то скрипт создает файл и запускается, иначе, если файл есть, то не запускается!

Ты конечно молодец что даёшь ответы, но твои варианты я итак уже решил по иному, но они не решают мою задачу, вот как я их обыграл: 1. можно использовать команду wait перед каждой задачей, результат будет тот же; 2. это проверка на наличие файла if exist? она мне не нужна, мне нужно проверить наличие ЗАПУЩЕННОГО файла батника. Все эти варианты не подходят. Хотелось бы увидеть ваше мнение по решению данной задачи, заранее спасибо!
Автор: YNY
Дата сообщения: 24.10.2010 09:14

Цитата:
firsteducation, ...мнение по решению данной задачи

Бат файлы запускаются в контексте процесса CMD они всего лишь комманды, а не самостоятельные процессы, так что твое желание мягко говоря...
В общем, скриптами данная задача -- распознавание из какова файла запущен bat скрипт, не решается никак, посредством самих bat: тут один герой рыл тему "подписи на событие создания файла посредством WMI" мож тебе подойдет, но исчи сам).
Нашел [more=вот это]
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'cmd.exe'")
    
For Each objItem in colItems
    
        Wscript.Echo "CommandLine: " & objItem.CommandLine & vbCrLf & _
                 " Name of procces: " & objItem.Name
            
Next
msgbox colItems.Count ' -- определяет скоко результатов найдено, т.е. скока раз запущен CMD, но не кем!
[/more], но не знаю поможет тебе или нет, т.к. проверка на наличие запущенного процесса cmd из bat определяется в vbs скрипте) (для теста запусти bat с паузой, а затем кликни на vbs).

Реально и быстро эта задача решается, к примеру, на С++ ))), а т.к. это уже не скрипты, то ищи в соотв ветке!!!
PS: по поводу wait
используя wait ты должен импирическим путем подбирать время ожидания, а используя мою подсказку не должен!
Автор: firsteducation
Дата сообщения: 24.10.2010 16:03
YNY Всё я решил свою задачу. Простенько! взял да скомпилил батник в экзешник программкой: batch to exe converter. Процесс файла теперь виден! Всем пока я нашёл ответы на свои вопросы!
Автор: fedmun
Дата сообщения: 27.10.2010 13:47
Подскажите программу или скрипт:
Необходимо перемещать файлы и каталоги старше определенной даты в другой каталог с сохранением дерева каталогов.
Пока нашел JaBack.
Может еще что есть?
Автор: vlary
Дата сообщения: 27.10.2010 14:37
fedmun Как насчет стандартной robocopy ?
Автор: fedmun
Дата сообщения: 27.10.2010 21:09
vlary

Цитата:
Как насчет стандартной robocopy

ОНО! Спасибо. Уже лет 5 в скриптах работает, а опции до конца не изучил
Автор: Lovec
Дата сообщения: 01.11.2010 16:42
All
Надо проверить является ли компьютер членом OU с названием "Test_OU" или нет. Что то весь день пробился лбом об стену и все зря...

В MSDN есть описание класса "Computer Class", у которого есть свойство "Organizational-Unit-Name" - проде как оно. Но никак не могу написать скрипт чтобы его прочесть, правильно запрос LDAP не могу написать...

Есть вот такой скрипт для объекта User, который показывает какой скрипт запускается у него при логине

Код:
Set oUser = GetObject("LDAP://CN=Иван Иванович Иванов,OU=OU_Users,DC=MyDomain,DC=local")
oUser.GetInfo
MsgBox oUser.Get("scriptPath")
Автор: YNY
Дата сообщения: 01.11.2010 19:18

Цитата:
Lovec

БЛИН, в шапке "подробнее" смотри -- там есть!!!
Автор: BVV63
Дата сообщения: 02.11.2010 09:10
Lovec
Чем не устраивают стандартные команды DSGet и DSQuery? Напр.,

Код: DSGet Group "Имя_группы" -Members
Автор: Lovec
Дата сообщения: 02.11.2010 10:50
YNY
Я посмотрел все ссылки в шапке, в том числе в разделе "подробнее" и не нашел ничего отвечающего на мой вопрос. Если все же есть, уж ткните, не поленитесь...

BVV63

Цитата:
Чем не устраивают стандартные команды DSGet и DSQuery

Честно говоря не знал про такие...
Посмотрел. Хотел попробовать глянуть что выдает команда "DSGet Group" и что то у меня не получилось
Пишу по аналогии с вашим примером

Код:
dsget group OU_Users -members
Автор: olview
Дата сообщения: 02.11.2010 12:33
Привет всем, помогите решить пару вопросов!
1. Есть сеть около 200 пк, пользуюсь прогой psexec(пытаюсь поставить симантек), и почему то на не которых станциях пишиет мол процес запущен, хотя на самом деле ни чего не происходит. На других нормально, все запускается!


2. Может быть есть у кого скрипт который собирает инфу об установленном софте со всех пк в сети и записывает их в файл такого вида Имя_ПК Имя_софта Версия
Причем софт нужен не весь, а на пример только симантек
Автор: BVV63
Дата сообщения: 02.11.2010 13:13
olview

Цитата:
Причем софт нужен не весь, а на пример только симантек

Иными словами, Вам требуется узнать, на какие компы встал Симантик, а на какие нет? Это элементарным батником можно сделать, который посредством PSExec запустите в домене. Поглядите характерный файл или ключ реестра или службу на компе с установленным Симантеком и проверяйте их наличие. А батник пусть в какой-нить шаре записывает в текстовый файл имена компов (%ComputerName%), где Симантек стоит (или наоборот).
Автор: olview
Дата сообщения: 02.11.2010 13:42

Цитата:
Иными словами, Вам требуется узнать, на какие компы встал Симантик, а на какие нет? Это элементарным батником можно сделать, который посредством PSExec запустите в домене. Поглядите характерный файл или ключ реестра или службу на компе с установленным Симантеком и проверяйте их наличие. А батник пусть в какой-нить шаре записывает в текстовый файл имена компов (%ComputerName%), где Симантек стоит (или наоборот).


Да именно так, что то я про батник то не подумал. Счас поковыряю, спасибо за наводку, тем не менее вопрос остается в силе т.к хочу еще на wsh сделать!
кое что есть, счас вот думаю как сделать продолжение, может быть кому пригодится

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile("c:\scripts\test.xls", True)

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSoftware = objWMIService.ExecQuery _
("Select * from Win32_Product Where IdentifyingNumber='{3C1AE512-3C37-44FA-BA42-ABB721EC5B1D}'")

objTextFile.WriteLine "Caption" & vbtab & _
"Description" & vbtab & "Identifying Number" & vbtab & _
"Install Date" & vbtab & "Install Location" & vbtab & _
"Install State" & vbtab & "Name" & vbtab & _
"Package Cache" & vbtab & "SKU Number" & vbtab & "Vendor" & vbtab _
& "Version"

For Each objSoftware in colSoftware
objTextFile.WriteLine objSoftware.Caption & vbtab & _
objSoftware.Description & vbtab & _
objSoftware.IdentifyingNumber & vbtab & _
objSoftware.InstallDate2 & vbtab & _
objSoftware.InstallLocation & vbtab & _
objSoftware.InstallState & vbtab & _
objSoftware.Name & vbtab & _
objSoftware.PackageCache & vbtab & _
objSoftware.SKUNumber & vbtab & _
objSoftware.Vendor & vbtab & _
objSoftware.Version
Next
objTextFile.Close
Автор: YNY
Дата сообщения: 05.11.2010 14:23

Цитата:
Lovec

хм, там про юзеров -- звиняй, для компов юзай [more=вот это]
Const ADS_SCOPE_SUBTREE = 2 ' или 0 если не интересны вложенные ОУ

Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"

Set objCOmmand.ActiveConnection = objConnection
objCommand.CommandText = _
"Select Name, Location from 'LDAP://OU=MyOU,DC=fabrikam,DC=com' " _
& "Where objectClass='computer'"
objCommand.Properties("Page Size") = 1000
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Set objRecordSet = objCommand.Execute
objRecordSet.MoveFirst
kolvo=0
Do Until objRecordSet.EOF
kolvo=kolvo+1
'Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value
'Wscript.Echo "Location: " & objRecordSet.Fields("Location").Value
objRecordSet.MoveNext
Loop
if (kolvo=0) then msgbox "нет ничего в OU=MyOU'

[/more]
Автор: Lovec
Дата сообщения: 08.11.2010 17:26
YNY
Спасибо, но не совсем то. Еще раз повторюсь, что вопрос звучит так: вот имя компа, вот название OU - на выходе надо получить "да" (комп принадлежит OU) или "нет" (комп не принадлежит OU)

Решение было найдено на просторах Интернет и вот моя реализация его на AutoIt:

Код:
Const $ADS_NAME_INITTYPE_DOMAIN = 1
Const $ADS_NAME_TYPE_NT4 = 3
Const $ADS_NAME_TYPE_1779 = 1
$strDomainName = "MyDomain"

$s_InputName = $strDomainName & "\" & @ComputerName & "$"
$o_Trans = ObjCreate("NameTranslate")
$o_Trans.Init ($ADS_NAME_INITTYPE_DOMAIN, $strDomainName)
$o_Trans.Set ($ADS_NAME_TYPE_NT4, $s_InputName)
$s_OutputName = $o_Trans.Get($ADS_NAME_TYPE_1779)
If StringInStr ($s_OutputName, "MyOU") Then ... - компьютер принадлежит орг.единице "MyOU"
Автор: YNY
Дата сообщения: 09.11.2010 11:04
хм, ну надо же до чего ленивый народ пошел да еще и не честный
Автор: Scaramanga
Дата сообщения: 12.11.2010 21:34
Всем привет. Задача следующая.

На КД создан DFS. C большим кол-вом папок, на которых разные права и т.д. Нужен скрипт автоматического подключения сетевого диска для каждого пользователя.

т.е.
Имеется пользователь с именем Иванов Иван и учеткой в AD ivanov.

корень выглядит так
Shara
- отдел
--Иванон Иван(т.е. полное имя пользователя совпадает с название папки)
- - - входящие
- - - исходящие


При входе должны автоматически монтироватся с правами вощедщего в домен пользователя следующие диски

Х - содержимое папки Shara (назвать диск Shara)
Y - содержимое папки входящие
Z - содержимое папки исходящие
(название папок соответствующие)

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

Заранее спасибо
Автор: Alukardd
Дата сообщения: 12.11.2010 22:06
Scaramanga
Если я правильно понял [more=вот скрипт]Option Explicit

Dim WSHShell, WSHNetwork, oShell, user, domain, adspath, adsobj, prop, computer, PrivateWay

Set WSHNetwork = WScript.CreateObject( "WScript.Network")
Set wshShell = WScript.CreateObject("WScript.Shell")
Set oShell = CreateObject("Shell.Application")

Do While WSHNetwork.username = ""
WScript.Sleep 250
Loop

user = wshNetwork.username
PrivateWay = "\\192.168.0.1\PrivateDocuments\"+user

WSHNetwork.MapNetWorkDrive "T:", PrivateWay
oShell.NameSpace("T:").Self.Name = "Личные документы "

WScript.Quit[/more] - работает через GP logon scripts
p.s. Там в скрипте объявлены лишние переменные - просто делал его из другого... если мешают можете не использующиеся удалить
Автор: Scaramanga
Дата сообщения: 13.11.2010 07:21

Как я понял тут ищется папка с именем пользователя в папке privatedocuments, у меня же в этой папке еще разные отделы а в них уже папки пользователей. Можно как нибудь организовать поиск папки пользователя во вложенных папках и затем ее монтирование?
Автор: YNY
Дата сообщения: 13.11.2010 07:38
Scaramanga можешь попробовать bat [more=вот с таким кодом]@echo off
set CurDte=%date%
rem создает постоянные подключения /persistent:yes

if /i %CurDte%==13.11.2010 (net use x: \\Server\Shara /persistent:yes
)&(net use y: \\Server\Otdel\user\inbound /persistent:yes
)&(net use z: \\Server\Otdel\user\outbound /persistent:yes
)
rem либо только в нижеследующей строке указать необходимость организации постоянных подключений
rem net use /persistent:yes [/more], повесив его также на логон. Проверка даты всунута т.к. создаются пост соединения, кот сама винда должна восстанавливать после перезагрузки
Автор: Scaramanga
Дата сообщения: 13.11.2010 08:49
YNY
тут придется вручную прописывать пути для каждого пользователя. Что не совсем удобно (количество пользователей свыше 2 сотен)



вот так выглядит структура папок
Автор: YNY
Дата сообщения: 13.11.2010 09:18
1
Автор: HUB107
Дата сообщения: 19.11.2010 20:38
Мужики спасайте! Есть куча раздробленных локалок и один центральный сервер. Хочу переименовать рабочие группы в каждой локалке в соответствии с IP адресом шлюза. Адрес шлюза каждой локалки хочу брать относительно сервера со страничке с кодом крутя на нём скрипт РНР вида "</strong><br><br> Ваш IP (ай-пи) адресс: <strong><?php echo $_SERVER['REMOTE_ADDR']; ?></strong>"

По хорошему клиентская машина запрашивает оттуда свой IP который и будет являться гейтом. Итого еще раз резюмирую задачу: надо из PHP странички выдрать адрес и вбить его вместо рабочей группы. Есть идеи?
Автор: Alukardd
Дата сообщения: 19.11.2010 20:46
HUB107
так если все шлюзы имеют различные IP адреса, то почему просто на их основе нельзя менять рабочую группу клиента? Зачем заниматься сексом с PHP-скриптом?

p.s. А вообще, при таких делах, думайте о домене.
Автор: HUB107
Дата сообщения: 20.11.2010 19:34
Alukardd
Некоторые клиенты перед основными шлюзами вкручивают себе роутеры. А мне надо чтоб высвечивались шлюзы взятые не с этих роутеров, а головные шлюзы каждой организации. PHP скрип как раз даже и при роутерах головные шлюзы корректно отображает. А домен ну никак не потянет при такой разношерстности ширины каналов и провайдеров.
Идеи по теме есть?
Автор: YNY
Дата сообщения: 21.11.2010 12:20

Цитата:
HUB107

1 твой скрипт всего лишь высвечивает IP того, кто открыл страничку, а никак не шлюз http://www.softtime.ru/article/index.php?id_article=69
2 роутеры как раз и являются "головными" шлюзами т.к. смотрят в инет иначе поясни терминологию!

Добавлено:
т.к. я не имею возмоности помотреть HTML код возвращаемый твоим скриптом (нет вебсервера под рукой), то предлагаю тебе изучить работу [more=вот такова]
Set objExplorer = WScript.CreateObject("InternetExplorer.Application")

objExplorer.Navigate "c:\12.html" '"about:blank"
objExplorer.ToolBar = 0
objExplorer.StatusBar = 0
objExplorer.Width=300
objExplorer.Height = 150
objExplorer.Left = 0
objExplorer.Top = 0
objExplorer.Visible = 1
    'objExplorer
Set objDoc = objExplorer.Document.Body
'strHTML = "привет"



'"This information is displayed in a separate window."
'objDoc.InnerHTML = strHTML
' objExplorer.Visible = True
msgbox objDoc.InnerHTML & vbcrlf & objDoc.innerText [/more] скрипта и либо сказать что тебе выдает либо доделать самому используя функцию instr() для выделения IP

Добавлено:
[more=Добавление в домен либо РГ]
The following VBScript code example joins a computer to a domain and creates the computer's account in Active Directory.

Const JOIN_DOMAIN = 1
Const ACCT_CREATE = 2
Const ACCT_DELETE = 4
Const WIN9X_UPGRADE = 16
Const DOMAIN_JOIN_IF_JOINED = 32
Const JOIN_UNSECURE = 64
Const MACHINE_PASSWORD_PASSED = 128 ' в небезопасном режиме цепляет только хост
Const DEFERRED_SPN_SET = 256
Const INSTALL_INVOCATION = 262144
strDomain = "FABRIKAM" ' -- имя домена или рабочей группы
strPassword = "ls4k5ywA" ' -- указать или NULL
strUser = "shenalan" ' -- указать или NULL
Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
Set objComputer = _
GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _
strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" _
& strComputer & "'")
ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _
strPassword, _
strDomain & "\" & strUser, _
NULL, _
JOIN_DOMAIN + ACCT_CREATE) ' если не указать JOIN_DOMAIN + ACCT_CREATE, т.е последнюю переменную, то вводит в РГ

[/more] После применения требуется перезагрузка!!!
Автор: HUB107
Дата сообщения: 22.11.2010 09:41
Ну давайте еще раз по порядку:

1) Есть сеть 10.121.0.0/24 Гейтом в ней является 10.121.0.1 Все клиенты через гейт успешно nat-ятся на 10.10.10.10(это центральный веб сервер со страничкой скрипта)

2) Имеем пример. Любой клиент из сети 10.121.0.0/24 при заходи на http://10.10.10.10/ip.php получает ответ плана "Ваш айпи: 10.121.0.1" , т.к. все клиента успешно nat-ятся через 10.121.0.1

3) Также в подсеть 10.121.0.0/24 воткнуто пара роутеров для создания отдельных подсеток вида 192.168.0.0/24(отделили так бухгалтерию и т.д) И при заходе на http://10.10.10.10/ip.php из их подсети, так же высвечивается ответ "Ваш айпи: 10.121.0.1" (ибо натятся по цепи 192.168.0.1 -> 10.121.0.1 -> 10.10.10.10)


4) Задача написать скрипт который:
а) получал бы ответ от http://10.10.10.10/ip.php
б) парсил его на выдергивание ip адреса основного гейта
в) забивал полученное значение ip как рабочую группу компьютера.
Автор: emfs
Дата сообщения: 22.11.2010 15:58
HUB107
а зачем парсить результат странички?
не лучше взять из ipconfig?
Автор: YNY
Дата сообщения: 22.11.2010 16:24

Цитата:
emfs

дело в том, что чел не осознает "не правильность" отработки данного php, но видит нужный ему ответ))
мона канешно и из ipconfig выдернуть, но т.к. это локальная сеть, то узнать какой шлюз именно "головной", в общем случае, почти незя, еще удобней, при отсутствии php, было бы его вырезать из tracert где нуный шлюз должен, при пост-й топологии, быть, к примеру, вторым хопом )

Добавлено:

Цитата:
HUB107

т.е. если я прально понял php скрипт будет всегда выдавать 10.121.0.1, если так, то накой его ваще выдергивать???
РС:
Если твой php скрипт выдает че ты хочешь, то приведи html код результата и я склею нужный тебе вариант скрипта из тех примеров, что я уже привел!
Автор: HUB107
Дата сообщения: 23.11.2010 18:59
1) их ipconfig не возьмешь гейт по причине наличия "воткнуто пара роутеров для создания отдельных подсеток вида 192.168.0.0/24"

2) трейсить маршрут и дергать оттуда гейт не вариант по личным соображениям

3) "т.е. если я прально понял php скрипт будет всегда выдавать 10.121.0.1" - не правильно поняли. в сети 10.121.1.0/24 он покажет гейт как 10.121.1.1

И не понял в чем ""не правильность"" моих суждений со скриптом на страничке. Я прекрасно понимаю что еслиб клиенты без nat-а ходили на сервак, то скрипт бы им их локальный ip выдавал. Но при nat-е видим головной шлюз ихней сетки.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576

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


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