none
Funkčnost xcopy pod GPO

    Dotaz

  • Dobrý den,
    předem se omlouvám za možná nesprávné zařazení dotazu do chybné kategorie.

    Během dne se z programu generují soubory, které se ukládají do samostatných adresářů.
    c:\data\DZ_1234\soubor1.pdf
                    soubor2.pdf
                    ...
            DZ_45678\soubor11.pdf  
                     soubor12pdf
                     ...
            DZ_67890\soubor111.pdf  
                     soubor112pdf
                     ...
    atd.
    Potřebuji, aby když si uživatel další den pustí počítač (windows XP nebo Windows Vista), tak aby se všechny podadresáře včetně souborů přesunuly do určeného adresáře na serveru a adresář c:\data zůstal "prázdný". Ty uvozovky proto, že tam jsou ještě další soubory, které tam musí zůstat. 

    Pro tento účel jsem napsal dávku s xcopy (na Windows XP není robocopy)
    @echo off
    dir c:\data\DZ* /b > c:\data\par.txt
    for /F %%i in (c:\data\par.txt) do xcopy c:\data\%%i\*.*  \\server\Home\Datove_zpravy\%%i\ /E /I /V /R /Y /C /Q >nul
    for /F %%i in (c:\data\par.txt) do rmdir c:\data\%%i\ /q /s >nul
    del c:\adisdata\par.txt
    

    Problém je v tom, že když ji spustím lokálně, tak funguje, když ji spustím přes systémovou politiku v rámci AD, jako skript po spuštění (je přitom jedno zda na HW nebo na uživatele), tak se xcopy neprovede a provede se jen smazání všech adresářů ve druhém cyklu.

    Předpokládám, že by chyba mohla být v použití UNC cesty, ale pak nerozumím tomu, proč mi stejná dávka funguje když ji spustím po přihlášení uživatele např. přes zástupce.

    Obejít to právě přes toho zástupce se to jistě dá, ale já bych rád pochopil v čem je problém.
    3. prosince 2009 7:32

Odpovědi

  • co znamena LOKALNE? I v pripade GP se spousti lokalne :)

    Problem je jinde: Ty pises lokalne ale myslis asi pod PRIHLASENYM UZIVATELEM.
    Pises ze zkousis jako COMPUTER i USER policy a ani jedno nefunguje:

    1. mas aplikovanou politiku "always wait for network ..." abys zabranil spusteni scriptu z pred funkcni siti?
    2. ma uzivatel pod kterym davka bezi prava? ke zdroji i cili? POZOR, v pripade computer policy je uzivatelem lokalni systemovy ucet ktery je standardne ve skupine DomainComputers
    3. kdyz ladis script presmeruj si STDOUT i STDERR nikoliv do nil ale do >> nejakeho debug.txt ve kterem si po (ne)uspesnem pubehu scriptu prectes co se delo !!!
    4. pokud pouzivas nebezpecne prikazy typu del je NAPROSTO ZAKLADNI pouzivat errorlevel a v pripade jakehokoliv problemu zamezit mazani


    MP
    3. prosince 2009 8:25
    Moderátor
  • - Everyone se chova dle nastaveni v GP :). Radeji pouzij Authenticated users nebo opravdu skupiny o ktere jde.
    - prava mam doufas nastavena na share i na NTFS !!!
    - bohuzel nevidim do obsahu textaku. chapu ze v bem je seznam adresaru ktere chces kopirovat. Nemas tam nejaky \ navic a pod?
    - so se tyce errorlevel ve foru: samozrejme za for viceradkovy slozeny prikaz () obsahujici if errorlevel 1 goto end
    - nemuzes vypnout echo off a pastnout kus vystupu? nebo misto XCOPY dej echo .. stavajici prikazy... >> log? Treba ti nekde chybi nejaka <>ina

    MP


    P.S. robocopy najdes v reskitu, umistis na server a odtamtez spustis. nicmene Xcopy je obcas stejne dobry a nekdy vykonnejsi

    3. prosince 2009 11:51
    Moderátor

Všechny reakce

  • co znamena LOKALNE? I v pripade GP se spousti lokalne :)

    Problem je jinde: Ty pises lokalne ale myslis asi pod PRIHLASENYM UZIVATELEM.
    Pises ze zkousis jako COMPUTER i USER policy a ani jedno nefunguje:

    1. mas aplikovanou politiku "always wait for network ..." abys zabranil spusteni scriptu z pred funkcni siti?
    2. ma uzivatel pod kterym davka bezi prava? ke zdroji i cili? POZOR, v pripade computer policy je uzivatelem lokalni systemovy ucet ktery je standardne ve skupine DomainComputers
    3. kdyz ladis script presmeruj si STDOUT i STDERR nikoliv do nil ale do >> nejakeho debug.txt ve kterem si po (ne)uspesnem pubehu scriptu prectes co se delo !!!
    4. pokud pouzivas nebezpecne prikazy typu del je NAPROSTO ZAKLADNI pouzivat errorlevel a v pripade jakehokoliv problemu zamezit mazani


    MP
    3. prosince 2009 8:25
    Moderátor
  • Odpovídám se spožděním, ale testoval jsem ...
    Lokálně - tím myslím, že se uživatel nejdříve přihlásí do domény a pak třeba přes zástupce tuto dávku spustí.

    ad 1) always wait for network jsem povolené neměl, nevěděl jsem o ní, povolil jsem to. Z popisu politiky mi vychází, že tato věc není vhodná pro notebooky, na které se uživatelé v terému hlásí s "nakešovaným" heslem popřípadě čipovou kartou. Je tomu tak?

    ad 2) Když jsem to četl, tak mě napadlo Bingo! Bohužel ale předčasně. Na adresář \\server\Home\Datove_zpravy\ jsem přidal právo nejdříve měnit, později úplné řízení pro doménové jméno počítače, na kterém politika je použita. 
    Sdílen je adresář \\server\Home\ s everyone a právy měnit, číst. Předpokládám, že Everyone zahrnuje i doménové jména počítačů.

    ad 3) Dobré upozornění. Díky za ně.
    Z logu jsem zjistil, že když adresář DZ_něco na \\server\Home\Datove_zpravy\ už existuje, tak xcopy soubory, které v něm jsou přepíše. Když na \\server\Home\Datove_zpravy\ neexistuje, tak vypíše 0 zkopírovaných souborů a adresář tam nevytvoří. Proto mi ta dávka nefunguje.
    Vyzkoušel jsem i možnost spustit xcopy 2 x, kdy poprvé použiju klíče /E /T /Y a vytvořím prázdnou strukturu adresářů a podruhé klíče /E /I /V /R /C /Y pro zkopírování souborů. Prázdná struktura adresářů se nevytvoří a přesměrování výstupu do logu při vytváření adresářů nic do logu nazapíše. Opět, když stejnou dávku pustím po přihlášení pod svým účtem, tak se struktura adresářů vytvoří.

    ad 4) Přiznám se, že netuším, jak do cyklu for /F %%i in (c:\data\par.txt) do rmdir c:\data\%%i\ /q /s errorlevel smysluplně zapracovat. Když dám podmínku =! 0, tak mohu v podstatě udělat 2 věci, zapsat to do logu a ukončit dávku. Nic jiného mě nenapadá.

    Nerad se vzdávám, ale tady mi nezbývá už moc k tomu, dát uživateli na plochu zástupce na tu dávku a nechat to na něm, kdy si dávku sám spustí.
    3. prosince 2009 10:17
  • Doplním.

    Když tu strukturu adresářů vytvořím ručne z příkazové řádky s parametry /E /T /Y  a pak nechám dávku proběhnout při startu počítače, tak se soubory zkopírují všechny.
    3. prosince 2009 10:25
  • - Everyone se chova dle nastaveni v GP :). Radeji pouzij Authenticated users nebo opravdu skupiny o ktere jde.
    - prava mam doufas nastavena na share i na NTFS !!!
    - bohuzel nevidim do obsahu textaku. chapu ze v bem je seznam adresaru ktere chces kopirovat. Nemas tam nejaky \ navic a pod?
    - so se tyce errorlevel ve foru: samozrejme za for viceradkovy slozeny prikaz () obsahujici if errorlevel 1 goto end
    - nemuzes vypnout echo off a pastnout kus vystupu? nebo misto XCOPY dej echo .. stavajici prikazy... >> log? Treba ti nekde chybi nejaka <>ina

    MP


    P.S. robocopy najdes v reskitu, umistis na server a odtamtez spustis. nicmene Xcopy je obcas stejne dobry a nekdy vykonnejsi

    3. prosince 2009 11:51
    Moderátor
  • Na share HOME jsem vedle everyone (změnit,číst) přidal práva i pro i Authenticated users (změnit, číst). Přidal proto, že to je adresář používaný všemi a nechci si momentálně zadělat na problém. Everyone odstraním až později, až tu nikdo nebude.

    Na adresáři HOME jsou NTFS práva pro Domain Users Číst a spouštět, Zobrazovat obsah složky a Číst. Zkoušel jsem tam pro test přidat stejné práva i pro Authenticated users, stejný výsledek.

    Na adresáři Datove_zpravy jsou NTFS práva pro doménové jméno počítače (konkrétně PC007) Měnit a později tam dal i Úplné řízení. Stejné doménové jméno počítače je použito i v GPO v Security Filtering.

    skript:
    dir c:\data\DZ* /b > c:\data\par.txt
    echo vypis logu > c:\data\log.txt
    for /F %%i in (c:\data\par.txt) do 
    xcopy c:\data\%%i\*.*  \\server\Home\Datove_zpravy\%%i\ /E /I /V /R /C /Y >>c:\data\log.txt 2>&1
    

    To xcopy pokračuje za do. Tady jsem to jen rozdělil kvůli přehlednosti

    seznam adresářů v c:\data\
    DZ_1009348
    DZ_1009639
    DZ_1009752
    DZ_1012452
    DZ_1019120
    DZ_1021145
    DZ_1038503
    DZ_1044509
    atd.
    V adresářích jsou převážně soubory, jejichž formáty jsou povolené pro datové schránky. Jeden nebo více.
    Adresář DZ_1009639 jsem úmyslně před restartem počítače na cílový disk přenesl ručně, to proto aby vůbec v logu něco bylo. Jinak tam je vždy pouze Neplatná cesta.
    Výsledek:
    Neplatná cesta
    0 zkopírovaných souborů
    C:\adisdata\DZ_1009639\001O268014.PDF
    1 zkopírovaných souborů
    Neplatná cesta
    0 zkopírovaných souborů
    Neplatná cesta
    0 zkopírovaných souborů
    Neplatná cesta
    0 zkopírovaných souborů
    Neplatná cesta
    0 zkopírovaných souborů
    Neplatná cesta
    0 zkopírovaných souborů
    Neplatná cesta
    0 zkopírovaných souborů





    3. prosince 2009 12:43
  • jeste jednou:

    posli pro kontrolu par radku POSKLADANEHO xcopy (spouzteneho ve for), tedy neco jako:

    xcopy c:\data\DZ_1009348\*.*  \\server\Home\Datove_zpravy\DZ_1009348\ /E /I /V /R /C /Y
    xcopy c:\data\DZ_1009639\*.*  \\server\Home\Datove_zpravy\DZ_1009639\ /E /I /V /R /C /Y
    ....

    treba tam mas nekde \\ a pod.

    MP
    3. prosince 2009 12:50
    Moderátor
  • Aha, teď už rozumím.

    xcopy c:\data\DZ_1009348\*.* \\server\Home\Datove_zpravy\DZ_1009348\ /E /I /V /R /C /Y >>c:\data\log.txt 2>&1
    xcopy c:\data\DZ_1009639\*.* \\server\Home\Datove_zpravy\DZ_1009639\ /E /I /V /R /C /Y >>c:\data\log.txt 2>&1

    má v c:\data\log.txt tento obsah:

    Neplatná cesta
    0 zkopírovaných souborů
    Neplatná cesta
    0 zkopírovaných souborů



    Děkuji za nasměrování na robocopy. Netušil jsem, že je pod XP funkční. Toto už (s chybou) funguje. Data se přenesou. Při stejných právech k share i adresáři jaké byly u xcopy.

    dir c:\data\DZ* /b > c:\data\par.txt
    for /F %%i in (c:\data\par.txt) do \\server\Home\Datove_zpravy\robocopy c:\data\%%i\ \\server\Home\Datove_zpravy\%%i\ /E >>c:\data\log.txt 2>&1

    -------------------------------------------------------------------------------
       ROBOCOPY     ::     Robust File Copy for Windows     ::     Version XP010
    -------------------------------------------------------------------------------
    
      Started : Thu Dec 03 14:39:22 2009
    
    2009/12/03 14:39:22 ERROR 5 (0x00000005) Getting File System Type of Destination \\server\Home\Datove_zpravy\DZ_1009348\
    Přístup byl odepřen.
    
    
       Source : c:\data\DZ_1009348\
         Dest - \\server\Home\Datove_zpravy\DZ_1009348\
    
        Files : *.*
    
      Options : *.* /S /E /COPY:DAT /R:1000000 /W:30
    
    ------------------------------------------------------------------------------
    
    	  New Dir          1	c:\data\DZ_1009348\
    	    New File  		  202831	001O268014.PDF
      0%
     30%
     60%
     90%
    100%
    
    ------------------------------------------------------------------------------
    
                    Total    Copied   Skipped  Mismatch    FAILED    Extras
         Dirs :         1         1         0         0         0         0
        Files :         1         1         0         0         0         0
        Bytes :   198.0 k   198.0 k         0         0         0         0
        Times :   0:00:00   0:00:00                       0:00:00   0:00:00
    
        Speed :             1448792 Bytes/sec.
        Speed :              82.900 MegaBytes/min.
    
        Ended : Thu Dec 03 14:39:22 2009
    Předpokládám, že chyba má zase co do činění s právy. Nevím, který účet robocopy pro zjištění informací potřebuje.
    3. prosince 2009 13:49
  • a kdyz
    xcopy c:\data\DZ_1009348\*.*  \\server\Home\Datove_zpravy\DZ_1009348\ /E /I /V /R /C /Y

    pustis "rucne" jako user, admin .... s  a bez existence ciloveho adresare projde?

    co se tyce prav: modify /change (NTFS/CIFS) s dediscnosti musi stacit

    MP
    3. prosince 2009 14:11
    Moderátor
  • Ano, při ručním spuštění to funguje i bez existence cílového adresáře. Pod GPO to soubory zkopíruje pouze tehdy, když cílový adresář existuje. Stejně tak nefunguje ani parametr /T pro vytvoření prázdné struktury adresářů. Nic nevytvoří.





    Pokud je to možné, potřeboval bych si ještě ujasnit chybu robocopy z logu

    ERROR 5 (0x00000005) Getting File System Type of Destination 

    Ta chyba je v logu zapsaná, ale soubory jsou řádně zkopírované. Na stejnou chybu jsem našel odpověď na http://forums.techarena.in/printthread.php?t=12676

    If the batch file runs under the context of the local system account then it
    will not have rights on the remote machine, which is why it throws an
    "Access denied" error message.

    Předpokládám, že tato chyba je formálním nedostatkem a není se třeba jí dále zabývat.
    3. prosince 2009 15:56
  • ale rikal jsi ze mas DOmain Computers (je pocitac v Domain Computers?) v access control listu jan NTFS adresare tak sitoveho share. Mas tam i dedeni atd?

    MP
    3. prosince 2009 16:02
    Moderátor
  • ad "rikal jsi ze mas DOmain Computers v access control listu jan NTFS adresare tak sitoveho share"

    Nevím, jestli té otázce správně rozumím.

    Cíl je na Windows Server 2003, který je domain controler. Dědění funguje. Doménové jméno počítače je v NTFS  access control listu pro  adresář \\server\Home\Datove_zpravy\ . Do něho se kopírují celé adresáře DZ_*.  Když se tam nakopírují, tak práva zdědí. To funguje jak má.
    V share, který je na  \\server\HOME,  je everyone a zároveň a navíc i Authenticated users obojí s právem měnit. Doménové jméno počítače tam není. Když by nebylo doménové jméno počítače součástí Everyone, tak je určitě součástí Authenticated users. Kdyby tam nebyl, tak by mi nefungovalo dalších 20 politik. Ty ale fungují.

    Zdroj je na PC, které je v Domain Computers. Systémová politika se na něho jinak běžně aplikuje. Když pustím xcopy ručně, tak jsem přihlášen pod doménovým účtem. A je jedno jestli privilegovaným nebo ne.
    3. prosince 2009 17:22
  • Cíl je na Windows Server 2003, který je domain controler. Dědění funguje. Doménové jméno počítače je v NTFS  access control listu pro  adresář \\server\Home\Datove_zpravy\ . Do něho se kopírují celé adresáře DZ_*.  Když se tam nakopírují, tak práva zdědí. To funguje
    Jeste jednou:

    NTFS ACL je dejmetomu ACL pro d:\sdilene\home
    CIFS acl je acl ke sdilenemu prostredku (share home na severu server)

    Pokud pristupujici nema prava k prvnimu A ZAROVEN I k druhemu tak prava nema

    MP

    3. prosince 2009 19:36
    Moderátor
  • Ano tomu zároveň rozumím, ale počítač, prezentovaný svým doménovým jménem by snad součástí Authenticated users měl být, nebo snad není?

    Nevím to. Soudím tak z toho, že politiky, které mám nadefinované pouze v části HW mám v Security Filtering buď pod Authenticated users (tzn. že se aplikují na všecny počítače) nebo jen na výčet doménových jmen počítačů (to v případě, že chci politiku aplikovat jen na ně).

    Jinak díky za vaši trpělivost.
    3. prosince 2009 20:14