locked
detach-elt mdf fájl átnevezése xp_cmdshell-lel RRS feed

  • Question

  • Sziasztok, a problémám a következő:

    scriptből detach-elek egy adatbázist, majd a detach-elt fájlokat szeretném átnevezni xp_cmdshell-lel. Átnevezés helyett sajnos "hozzáférés megtagadva" üzenetet kapok. Akkor is ha bezárom a Management Studiot, és nyitok egy újat, és onnan próbálom külön futtatni az átnevezést. Viszont ha a fájt "kívülről" elmozgatom a helyéről, majd visszarakom a helyére, akkor már lefut az átnevezés szó nélkül.

     

    A kód:

     

    exec sp_detach_db 'database'

    go

     

    exec xp_cmdshell 'rename d:\mssql\data\database.mdf database.old.mdf'

    exec xp_cmdshell 'rename d:\mssql\data\database_log.ldf database_log.old.ldf'

    go

     

    Reprodukálható ez nálatok? Van valakinek megoldása (vagy legalább tippje)?

    Kösz!

    Szabolcs

     

     

    Saturday, November 15, 2008 5:48 PM

Answers

  • Szia!

       Ez eléggé buktának tűnik... Az a helyzet, hogy az SQL Serverben a DBCC DETACHDB valamiért úgy lett implementálva, hogy amikor lefut, akkor a detacsolt fájlok jogosultságát átállítja, méghozzá úgy, hogy levesz róluk minden létező jogot, és egyedül a detacsot futtató felhasználónak lesz rá joga.
       A "tűnik" szót azért írtam oda, mert csak tűnik, de nem az Smile. Ha ez a saját kis játszótered, akkor csak egy kicsi hekk kell hozzá:

    Code Snippet

    EXECUTE AS LOGIN='tivadar'

    exec sp_detach_db 'database'

    exec xp_cmdshell 'rename d:\mssql\data\database.mdf database.old.mdf'

    exec xp_cmdshell 'rename d:\mssql\data\database_log.ldf database_log.old.ldf'

    REVERT

    GO



    Itt a tivadar login egy SQL account a sysadmin role-ban. Mivel neki nincsen windows accountja, a DBCC hoppon marad, és nem túrja szét a jogosultságokat. (Ezután akár már a saját, lokáladmin accountoddal is tudod módosítani a fájlnevet.) (a felesleges go-t kivettem Smile)

    Több infó erről a feature-ről a Books Online-ban: ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/849b9f34-baac-48f2-b953-7bc96f58526f.htm

    Magánvélemény: Komolyabb helyen nem használok xp_cmdshellt. Inkább scriptelek kívülről, ha lehet, és SQLCMD-vel tolom le az SQL torkán azt, amit le kell. A security mindig jó, és mióta van Powershell, senki sem mondhatja, hogy nehéz scriptet írni Smile
    Sunday, November 16, 2008 2:46 PM

All replies

  • a kollega Vistan kuzd vele, en megneztem XPn.

     

    Code Snippet

    create database PROBA

    go

    use PROBA

    select * from sysfiles

    go

    use master

    exec sp_detach_db 'PROBA'

    go

     

    -- ide be kell irni a megfelelo utvonalat :)

    exec xp_cmdshell 'copy D:\SqlData\MSSQL.1\MSSQL\DATA\PROBA.mdf D:\SqlData\MSSQL.1\MSSQL\DATA\PR.mdf'

     

     

    eredmeny:

    Code Snippet

    output

    A hozzáférés megtagadva.

    0 fájl másolása történt meg.

    NULL

    (3 row(s) affected)

     

     

    de a process explorer szerint semmi sem fogja a fajlt :-o

    a total cmd siman lemasolja, sot le is tudja torolni.

    Ha TCvel elrakom innen a fajlt aztan vissza, akkor mar az SQL is tudja kezelni.

    az SQL service Local systemmel fut.

    a gepen nincs megosztas, nem halozati tag, tehat security fulet nem hoz a properties ablak, a fajl tulajdonosa a builtin/administrators, eppugy mint a hasznalatban levo fajloknak is.

    ha elmozgatom meg vissza rakom, akkor en leszek az owner (en amugy localadmin vagyok termeszetesen Smile )

    es persze utana mar az SQL is viszi ahova csak kell

    mi lehet a bibi??

     

     

    Saturday, November 15, 2008 7:14 PM
  • Jogosultság, sql service account-nak a file-on milyen joga van?.

    Lásd: (http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2571364&SiteID=1)

     

    Sunday, November 16, 2008 8:08 AM
  • Szia!

       Ez eléggé buktának tűnik... Az a helyzet, hogy az SQL Serverben a DBCC DETACHDB valamiért úgy lett implementálva, hogy amikor lefut, akkor a detacsolt fájlok jogosultságát átállítja, méghozzá úgy, hogy levesz róluk minden létező jogot, és egyedül a detacsot futtató felhasználónak lesz rá joga.
       A "tűnik" szót azért írtam oda, mert csak tűnik, de nem az Smile. Ha ez a saját kis játszótered, akkor csak egy kicsi hekk kell hozzá:

    Code Snippet

    EXECUTE AS LOGIN='tivadar'

    exec sp_detach_db 'database'

    exec xp_cmdshell 'rename d:\mssql\data\database.mdf database.old.mdf'

    exec xp_cmdshell 'rename d:\mssql\data\database_log.ldf database_log.old.ldf'

    REVERT

    GO



    Itt a tivadar login egy SQL account a sysadmin role-ban. Mivel neki nincsen windows accountja, a DBCC hoppon marad, és nem túrja szét a jogosultságokat. (Ezután akár már a saját, lokáladmin accountoddal is tudod módosítani a fájlnevet.) (a felesleges go-t kivettem Smile)

    Több infó erről a feature-ről a Books Online-ban: ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/849b9f34-baac-48f2-b953-7bc96f58526f.htm

    Magánvélemény: Komolyabb helyen nem használok xp_cmdshellt. Inkább scriptelek kívülről, ha lehet, és SQLCMD-vel tolom le az SQL torkán azt, amit le kell. A security mindig jó, és mióta van Powershell, senki sem mondhatja, hogy nehéz scriptet írni Smile
    Sunday, November 16, 2008 2:46 PM
  • Szia, kösz szépen a megoldást! Smile

     

    Igazából a kód generált lesz, és leginkább olyan szervereken fog futni, ahol SQL szinten nagyobb szabadságot élvezünk, mint oprendszer szinten, úgyhogy maradunk SQL oldalon.

     

    Szabolcs
    Monday, November 17, 2008 6:59 PM