|
Операційні системи / адміністрування Linux, Unix, Windows, DOS... обговорюєм можливості, налагодження, встановлення, продуктивність, секрети... |
|
Параметри теми | Пошук у темі | Параметри перегляду |
20.07.2012, 01:41 #1994737 | #1 |
Задачі на .bat-файлах
Не знайшов подібної теми, надіюся вона буде комусь цікавою.
Пропоную тут ділитися вирішеннями якихось задач по автоматизації адміністрування віндовса методами командної стрічки або power shell і пробувати спільно вирішувати якісь задачі. Отож почну першим. Дано: Робочу групу з 46 машин адмінські шари Потрібно: розкинути з одного компа на певні компютери файли з одинаковим шляхом Після риття в інтернетах, і купи експериментів наваяв таке:
Прихований текст: copy.bat
Батнік монтує диски E: з компютерів, айпішки яких прописані в файлі list.txt в поточній директорії (в мене це була D:\temp) на мережевий диск Z: , копіює на них файл cs.tib який знаходиться по шляху D:\temp\1\ і розмонтовує мережевий диск. в файлі list.txt можна прописувати не лише айпішки, а й конкретні папки на віддалених машинах - того цей скріпт достатньо гнучкий. Надіюся комусь він стане в пригоді. |
|
Офтопів до посту: 0 Офтоп |
20.07.2012, 16:29 #1995289 | #4 |
ムゲツ
|
Відповідь: Задачі на .bat-файлах
Давно юзаю павершел, як для адміністрування гіпервізорів (Ксен і вСфери), так і для посякденних задач.
Ось один з бомбових прикладів - скрипт перевірки відкритості портів на ПК Код:
function Test-Port{ <# .SYNOPSIS Tests port on computer. .DESCRIPTION Tests port on computer. .PARAMETER computer Name of server to test the port connection on. .PARAMETER port Port to test .PARAMETER tcp Use tcp port .PARAMETER udp Use udp port .PARAMETER UDPTimeOut Sets a timeout for UDP port query. (In milliseconds, Default is 1000) .PARAMETER TCPTimeOut Sets a timeout for TCP port query. (In milliseconds, Default is 1000) .EXAMPLE Test-Port -computer 'server' -port 80 Checks port 80 on server 'server' to see if it is listening .EXAMPLE 'server' | Test-Port -port 80 Checks port 80 on server 'server' to see if it is listening .EXAMPLE Test-Port -computer @("server1","server2") -port 80 Checks port 80 on server1 and server2 to see if it is listening .EXAMPLE @("server1","server2") | Test-Port -port 80 Checks port 80 on server1 and server2 to see if it is listening .EXAMPLE (Get-Content hosts.txt) | Test-Port -port 80 Checks port 80 on servers in host file to see if it is listening .EXAMPLE Test-Port -computer (Get-Content hosts.txt) -port 80 Checks port 80 on servers in host file to see if it is listening .EXAMPLE Test-Port -computer (Get-Content hosts.txt) -port @(1..59) Checks a range of ports from 1-59 on all servers in the hosts.txt file #> [cmdletbinding( DefaultParameterSetName = '', ConfirmImpact = 'low' )] Param( [Parameter( Mandatory = $True, Position = 0, ParameterSetName = '', ValueFromPipeline = $True)] [array]$computer, [Parameter( Position = 1, Mandatory = $True, ParameterSetName = '')] [array]$port, [Parameter( Mandatory = $False, ParameterSetName = '')] [int]$TCPtimeout=1000, [Parameter( Mandatory = $False, ParameterSetName = '')] [int]$UDPtimeout=1000, [Parameter( Mandatory = $False, ParameterSetName = '')] [switch]$TCP, [Parameter( Mandatory = $False, ParameterSetName = '')] [switch]$UDP ) Begin { If (!$tcp -AND !$udp) {$tcp = $True} #Typically you never do this, but in this case I felt it was for the benefit of the function #as any errors will be noted in the output of the report $ErrorActionPreference = "SilentlyContinue" $report = @() } Process { ForEach ($c in $computer) { ForEach ($p in $port) { If ($tcp) { #Create temporary holder $temp = "" | Select Server, Port, TypePort, Open, Notes #Create object for connecting to port on computer $tcpobject = new-Object system.Net.Sockets.TcpClient #Connect to remote machine's port $connect = $tcpobject.BeginConnect($c,$p,$null,$null) #Configure a timeout before quitting $wait = $connect.AsyncWaitHandle.WaitOne($TCPtimeout,$false) #If timeout If(!$wait) { #Close connection $tcpobject.Close() Write-Verbose "Connection Timeout" #Build report $temp.Server = $c $temp.Port = $p $temp.TypePort = "TCP" $temp.Open = "False" $temp.Notes = "Connection to Port Timed Out" } Else { $error.Clear() $tcpobject.EndConnect($connect) | out-Null #If error If($error[0]){ #Begin making error more readable in report [string]$string = ($error[0].exception).message $message = (($string.split(":")[1]).replace('"',"")).TrimStart() $failed = $true } #Close connection $tcpobject.Close() #If unable to query port to due failure If($failed){ #Build report $temp.Server = $c $temp.Port = $p $temp.TypePort = "TCP" $temp.Open = "False" $temp.Notes = "$message" } #Successfully queried port Else{ #Build report $temp.Server = $c $temp.Port = $p $temp.TypePort = "TCP" $temp.Open = "True" $temp.Notes = "" } } #Reset failed value $failed = $Null #Merge temp array with report $report += $temp } If ($udp) { #Create temporary holder $temp = "" | Select Server, Port, TypePort, Open, Notes #Create object for connecting to port on computer $udpobject = new-Object system.Net.Sockets.Udpclient($p) #Set a timeout on receiving message $udpobject.client.ReceiveTimeout = $UDPTimeout #Connect to remote machine's port Write-Verbose "Making UDP connection to remote server" $udpobject.Connect("$c",$p) #Sends a message to the host to which you have connected. Write-Verbose "Sending message to remote host" $a = new-object system.text.asciiencoding $byte = $a.GetBytes("$(Get-Date)") [void]$udpobject.Send($byte,$byte.length) #IPEndPoint object will allow us to read datagrams sent from any source. Write-Verbose "Creating remote endpoint" $remoteendpoint = New-Object system.net.ipendpoint([system.net.ipaddress]::Any,0) Try { #Blocks until a message returns on this socket from a remote host. Write-Verbose "Waiting for message return" $receivebytes = $udpobject.Receive([ref]$remoteendpoint) [string]$returndata = $a.GetString($receivebytes) } Catch { If ($Error[0].ToString() -match "\bRespond after a period of time\b") { #Close connection $udpobject.Close() #Make sure that the host is online and not a false positive that it is open If (Test-Connection -comp $c -count 1 -quiet) { Write-Verbose "Connection Open" #Build report $temp.Server = $c $temp.Port = $p $temp.TypePort = "UDP" $temp.Open = "True" $temp.Notes = "" } Else { <# It is possible that the host is not online or that the host is online, but ICMP is blocked by a firewall and this port is actually open. #> Write-Verbose "Host maybe unavailable" #Build report $temp.Server = $c $temp.Port = $p $temp.TypePort = "UDP" $temp.Open = "False" $temp.Notes = "Unable to verify if port is open or if host is unavailable." } } ElseIf ($Error[0].ToString() -match "forcibly closed by the remote host" ) { #Close connection $udpobject.Close() Write-Verbose "Connection Timeout" #Build report $temp.Server = $c $temp.Port = $p $temp.TypePort = "UDP" $temp.Open = "False" $temp.Notes = "Connection to Port Timed Out" } Else { $udpobject.close() } } #Merge temp array with report $report += $temp } } } } End { #Generate Report $report } } Test-Port |
Подякував(ла): |
$iD (20.07.2012)
|
Офтопів до посту: 0 Офтоп |
24.11.2012, 03:06 #2081720 | #6 |
Відповідь: Задачі на .bat-файлах
Була задачка. Робоча група на багато компів Windows XP sp3, встановлені браузери Опера і Мозіла. Треба автоматизувати зміну стартової сторінки на потрібну мені (наприклад http://forum.te.ua/), і виставлення шляхів дефолтного збереження файлів на шару в залежності від номера компа, (по принципу \\192.168.56.10\pc_0*порядковий номер компютера*)
Вот кусок скріпта по автонастройці:
Прихований текст: скріпт
Принцип роботи: змінна var в мене маэ значення порядкового номера компютера. Налаштування Опери знаходяться у файлі operaprefs.ini за шляхом C:\Documents and Settings\$iDadmin\Application Data\Opera\Opera\ Налаштування Мозілли в файлі prefs.js за шляхом C:\Documents and Settings\$iDadmin\Application Data\Mozilla\Firefox\Profiles\*профіль*(профіль на кожному компютері унікальний) Скріпт перебирає обидва ці файли, шукає відповідні стрічки з записом настройок і вписує туда задані мною значення. Надіюся комусь скріпт стане в пригоді. |
|
Офтопів до посту: 0 Офтоп |
28.01.2016, 16:39 #2611090 | #7 |
Відповідь: Задачі на .bat-файлах
Підніму стару тему. Стикнувся з задачею: є маленька фірма, на ній стоїть сервер (windows 7 x64) з 1с і всякими потрімними документами (.xls, .doc i т.д.). Недавно вчепили на тому сервері кріптолокер. Купу важливої інфи втратили, тре було настроїти систему бекапів, щоб в майбутньому такого не повторилося. Зібрали зі старого компютера FreeNAS сервер з CIFS-шарою і написав такий от скріпт (точніше адапував оцей - ЛІНК):
Прихований текст: BAT
Цей скріпт запускаэться на сервері, монтує нас-шару як мережевий диск W:, у якій перевіряє присутність папки Archive, у цій папці створює папку з датою бекапу. У цю папку через 7zip архівує папки baza (архів називатиметься 1с.7z) і Work (work.7z). Також в цій папці пишеться лог бекапу (%date%.log) Після закінчення архівації - скріпт впорядковує папки з датами і залишає 20 найн овіших, решту видаляє. Після чого розмонтовує диск. Цей скріпт примонтував до шедюлера сервера на виконання кожного робочого дня за 1 годину до закінчення. Так як шара на насі прихована і запаролена, і НАС зєднується лише з сервером і то на +- 30 хв в день. - криптолокери і інші віруси туди не повинні добратися. Можливо комусь пригодиться таке рішення. |
|
Офтопів до посту: 0 Офтоп |
29.01.2016, 20:17 #2611506 | #9 |
Відповідь: Задачі на .bat-файлах
Ектів діректорі не всюди панацея, попробуй поясни власнику малого бізнесу, що йому потрібно додаткові дві машини для КД (без репліки не пропонувати, ймовірність виложити мережу через креш КД приблизно рівна ймовірності просрати дані). Тому всякі костилі у вигляді бат-файлів мають право на існування та свою нішу застосування. |
|
Подякував(ла): |
$iD (03.02.2016)
|
Офтопів до посту: 0 Офтоп |
02.02.2016, 15:35 #2612254 | #11 |
псіх одіночка
|
Відповідь: Задачі на .bat-файлах
Ми зрбили простіше. Сервер поставили на Дебіані , там встановили віртуалки на вінді з сервером ліцензій 1С і б/д 1С і бекап кожного дня ну і відповідно теж 20-30 днів з видаленням старих бекапів і не треба придумувати ніяких костилів. і вінти в рейді. Відновити з бек-апу віртуалки бази 1С і всі файли простіше ніж придумувати куму гемору. (Фірма напевно ще менша ніж 46 машин) Все просто і сердито.
Востаннє редагував Distemper: 03.02.2016 о 09:51. |
Офтопів до посту: 0 Офтоп |
03.02.2016, 15:18 #2612454 | #13 |
псіх одіночка
|
Відповідь: Задачі на .bat-файлах
Вінти в рейді конфіги всі збережені Дебіана тому відновити і розгорнути заново Лінус не проблема. 4 вінта 2 по 2 в реді і все. за 2 роки жодних серйозних проблем не виникало. Виникали лише після того коли вимикалося світло накопичувалися помилки в самій 1С і тоді їх віддалено чистили ІТ-шники 1С тех-сапорта , але то вже не наші проблеми. |
Офтопів до посту: 0 Офтоп |
|
|