Puppeteers Blog

Windowsin järjestelmätiedostojen ylikirjoittaminen Puppetilla

April 10, 2016 

Windowsin järjestelmätiedostoja ei useinkaan pysty muuttamaan käsin - tai Puppetilla - ilman niiden suojaustason alentamista. Ongelma on siinä, että järjestelmätiedostojen omistaja on usein (pseudo)käyttäjä "TrustedInstaller", eikä edes administrator-tason käyttäjillä ole niihin kirjoitusoikeutta. Onneksi rajoitukset voi kiertää melko suoraviivaisesti käyttämällä takeown.exe -komentoa sekä puppetlabs/acl -moduulia. Alla on muokattu erästä Group Policyn XML-tiedostoa, jonka merkistökoodaus oli siinä määrin poikkeuksellinen, että sen lukeminen Rubyn reXML -kirjastolla ei onnistunut:

include ::acl
 
 # Vaihda tiedoston omistaja
 exec { 'takeown-Search.admx':
 command => 'C:WindowsSystem32takeown.exe /f C:WindowsPolicyDefinitionsSearch.admx',
 }
 
 # Määritä uudet oikeudet
 acl { 'Search.admx':
 target => 'C:/Windows/PolicyDefinitions/Search.admx',
 permissions => [
 { identity => 'Järjestelmänvalvojat', rights => ['full'] },
 { identity => 'SYSTEM', rights => ['full'] }
 ],
 require => Exec['takeown-Search.admx'],
 }
 
 # Korvaa tiedosto
 file { 'C:/Windows/PolicyDefinitions/Search.admx':
 source => 'puppet:///modules/winpolicydefinitions/Search.admx',
 require => Acl['Search.admx'], 
 }

Tästä prosessista kannattaisi muokata oma määritelty resurssinsa, tai jopa peräti oma tyyppinsä, mikäli sille löytyisi runsaasti käyttöä. Takeown-komentoon kannattaisi lisätä myös "unless"-parametri, jotta sitä ei ajeta turhaan joka kerta. Jos Execissä olisi "provider => 'powershell'", niin tarkistuksen voisi tehdä muutamin eri tavoin.

Samuli Seppänen
Samuli Seppänen
Author archive
menucross-circle