Kuidas kopeerida faile mitmesse arvutisse

From ICO wiki
Jump to navigationJump to search

Sissejuhatus

Failide kopeerimiseks mitmesse arvutisse on erinevaid võimalusi.
Kõige lihtsam ja esimesena meelde tulev viis, kuidas faile mitmesse arvutisse kopeerida, on ilmselt kõik arvutid ükshaaval läbi käia ja mõne välise seadme (näiteks CD, USB jne) abil failid arvutitesse kopeerida.
Kuid kui arvutied on palju, siis on see ajamahukas protsess. Samuti ei tule selline lahendus kõne alla, kui arvutid asuvad ruumiliselt hajusalt (harukontorid vmt olukord).
Kui arvutite ükshaaval läbi käimine ei ole variant, siis sellisel juhul saab abiks võtta Windowsi skriptimiskeeled (PowerShell, VB Script vmt) ning neis kirjutatud fail kasvõi command line (cmd) abil käivitada. Kui arvutid asuvad ühises domeenis, siis saab kasutada ka Windowsi domeeni serveri Group Policy Object Editori (GPO Editor) abi.

Eeldused

1. On olemas keskne kopeeritavate failide hoidja, näiteks server
2. On olemas klientarvutid, kuhu failid kopeeritakse
3. Klientarvutid on ligipääsetavad serverist
4. On olemas üks kindel kaust klientarvutites, kuhu failid kopeeritakse
5. Klientarvutite kopeeritavaid faile vastuvõtval kaustal on õigused määratud nii, et sinna on võimalik serverist faile kirjutada


Näiteks, kui klientarvutites on kaust ’test’, siis tema seaded võiksid olla näiteks järgmised:
(hiire parema klahviga klikk kaustal ’test’ -> Properties -> Advanced Sharing -> Permissions -> vali mingi grupp või kasutaja, kellel on õigus serverist faile arvutisse kopeerida)


Skript

Kui eeldused on täidetud, siis tuleb kirjutada skript. Skript võib olla ka nii lihnte nagu järgnev:

  xcopy „\\ServerName\Shared\file.txt“ „\\DestinationComputer\test\“

kus xcopy on käsk ning esimesel kohal kopeeritava faili asukoht koos faili nimega ning teisel kohal lõppasukoht kopeeritavale failile.
Salvestades selle rea *.bat või *.cmd faili ning kirjutada analoogsed read ka teistele arvutitele ning failidele, saabki kopeerida mitmeid faile mitmetesse arvutitesse. Samuti saab kopeerida teatud tüüpi faile – toodud näide tuleks siis asendada selliselt:

  xcopy „\\ServerName\Shared\*.txt“" „\\DestinationComputer\test\“

mis kopeerib serveri ’Shared’ kaustast kõik tekstifailid klientarvuti ’test’ kausta.
Samas on sellise meetodiga palju käsitsi tööd nind kood veaohtlik.
Samas võib skript olla ka keerulisem ent lihtsam hallata. Näiteks selline VB Script (script_copy.vbs):

 Const ForReading = 1
 /*Kirjutab failid üle, kui juba on ees samanimeline fail*/
 Const OverwriteExisting = TRUE  
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 /*arvutite nimekiri avatakse*/
 Set objFile = objFSO.OpenTextFile("\\ServerName\Shared\computers.txt")
 /*Tsüklis iga rida computers.txt failis käiakse läbi ja kopeeritakse fail file.txt kausta test*/
 Do Until objFile.AtEndOfStream
    strComputer = objFile.ReadLine
    strRemoteFile = "\\" & strComputer & "\test\"
    objFSO.CopyFile "\\ServerName\Shared\file.txt", strRemoteFile, OverwriteExisting
 Loop

Selle scripti toimimise eelduseks on fail ’computers.txt’, kus on igal real kirjas arvuti nimi, kuhu fail kopeeritakse. Näiteks:

Sellise arvutite nimekirja tekstifailina saab muidugi kirjutada ka käsitsi. Domeenis olevate arvutite puhul saab kasutada skripti, mis selle nimekirja automaatselt koostab. Kasutada saab käsku:

  dsquery computer –o rdn 

mis võtab domeeni serveriks olevast arvutist Active Directory-st kõikide arvutite nimed välja, domeeni tunnusteta (arvutite nimekirja küsimisel saab ka filtreid rakendada. Täpsemalt vaata: http://thebackroomtech.com/2009/06/11/howto-export-a-list-of-all-computers-in-an-ad-ou/ ) Seega domeeni serveris võiks skript olla kahes etapis:
1.’Copy.bat’ sisu:

  dsquery computer –o rdn > \\ServerName\Shared\computers.txt
  script_copy.vbs

2.’Script_copy.vbs’ sisu:

  Const ForReading = 1
  /*Kirjutab failid üle, kui juba on ees samanimeline fail*/
  Const OverwriteExisting = TRUE
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  /*dsquery-ga saadud arvutite nimekiri avatakse*/
  Set objFile = objFSO.OpenTextFile("\\ServerName\Shared\computers.txt")
  /*Iga rida computers.txt failis käiakse läbi ja kopeeritakse file.txt fail test kausta*/
  Do Until objFile.AtEndOfStream
     strComputer = objFile.ReadLine
     /*active directoryst loetud arvuti nimede ümbert jutumärkide eemaldamine*/
     computer = replace(strComputer, """", "")
     strRemoteFile = "\\" & computer & "\test\"
     objFSO.CopyFile "\\ServerName\Shared\file.txt", strRemoteFile, OverwriteExisting
  Loop

Seega tuleks command line-lt käivitada fail ’Copy.bat’, mis ise omakorda tõmbab käima skripti ’script_copy.vbs’. Mõlema skripti tulemuseks on, et igasse arvutisse, mis on kirjas ’computers.txt’ failis, kopeeritakse kausta ’test’ fail nimega ’file.txt’. Kõik, nii käivitatavad kui ka loetavad failid, asuvad serveris nimega ’ServerName’ kaustas ’Shared’. Sarnase skripti saab kirjutada ka näiteks PowerShellis. Süntaks on erinev, loogika täpselt sama. Ja loomulikult võib kopeeritavaid faile olla rohkem – lisades veel ühe tsükli, mis käib läbi failide nimekirja, mida kopeerida ning on analoogne arvutite nimekirjaga.   Näiteks võib kasutada sellist skripti:

  Const ForReading = 1
  Const OverwriteExisting = TRUE
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objFSO2 = CreateObject("Scripting.FileSystemObject")
  Set objFile = objFSO.OpenTextFile("\\ServerName\Shared\computers.txt")  
  Do 
    strComputer = objFile.ReadLine
    strRemoteFile = "\\" & strComputer & "\test\"
    Set objFile2 = objFSO2.OpenTextFile("\\ServerName\Shared \files.txt")  
    Do Until objFile2.AtEndOfStream
       strFile = objFile2.ReadLine
       strRemoteFile2 = "\\ServerName\Shared\"& strFile
       objFSO.CopyFile strRemoteFile2, strRemoteFile, OverwriteExisting
    Loop 
  Loop Until objFile.AtEndOfStream

Mis loeb kopeeritavate failide nimekirja failist files.txt. Failide nimekirja saab käsuga:

 dir /b > files.txt

Seega domeeni serveris võiks skripti täiendada ka nii:
1.’Copy.bat’ sisu :

  dsquery computer –o rdn > \\ServerName\Shared\computers.txt
dir \\ServerName\Shared /b > files.txt
script_copy.vbs

Domain Controller GPO Editor

Eelduseks Domain Controlled GPO Editor-i kasutamiseks on, et valmis on kirjutatud skript (näiteks eelmises punktis kirjutatud ’copy.bat’ või ’script_copy.vbs’ skript) ning et on seadistatud domeeni server.

GPO Editori abil saab failide kopeerimist arvutitesse seadistada näiteks domeeni arvutisse sisse või välja logimisel (logon/logoff scripts).

1. Ava GPO Editor

2. User Configuration -> Windows Settings -> Scripts (Logon/Logoff) - > Logon peal parema hiire klahviga klikk ja vali Properties

3. Avaneb skripti lisamise aken. Vajuta Add nuppu.

4. Avaneb faili otsimise aken. Otsi fail üles ja vajuta OK

5. Vajuta veelkord OK

Logon skripte saab käivitada ka User Properties kaardilt Profile sakilt (Active Directory Users and Computers -> parem klikk kasutaja nimel -> Properties -> Profile sakk -> Logon script)


Või ka arvuti avamisel või sulgemisel (Startup/Shutdown scripts). GPO Editor -> Computer Configuration -> Windows Settings -> Scripts (Startup/Shutdown)

Startup/Shutdown skriptide lisamise protseduur on analoogne Logon/Logoff skriptide lisamisele.

Kokkuvõte

Failide kopeerimiseks mitmesse arvutisse on palju võimalusi. Olenevalt kopeeritavate failide mahust, hallatavate arvutite arvust, tesotatava kopeerimise korratavusest jmt teguritest, tuleb valida sobivaim viis töö ära tegemiseks. Mõnikord ajab asja ära ka väga triviaalne skript ja teinekord ongi käsitsi kiirem töö ära teha, kui hakata suurt süsteemi sisse seadma.

Kasutatud materjalid

http://thebackroomtech.com/2009/06/11/howto-export-a-list-of-all-computers-in-an-ad-ou/
http://www.edugeek.net/forums/how-do-you-do/49033-copying-one-file-multiple-computers.html
http://www.pctips3000.com/how-to-create-and-use-logon-script-to-map-a-shared-folder-as-network-drive-for-all-domain-users-in-windows-server-2003/
http://blogs.technet.com/b/heyscriptingguy/archive/2007/05/15/how-can-i-copy-the-same-file-to-a-number-of-different-computers.aspx
http://www.w3schools.com/vbscript/vbscript_looping.asp

Marika Mäemets DK21