[Win32/Delphi] ACL op printer

Pagina: 1
Acties:

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
Ik heb een programma wat automatisch printers aanmaakt (zie ElePrint source voor de Delphi source). Het programma maakt op een terminal server (danwel NT4 TSE, danwel Windows 2000) een aantal printers aan.

Omdat er meerdere users op dezelfde server zijn, mogen die elkaars printers niet zien (dit veroorzaakt namelijk verwarring bij de eind gebruiker). De oplossing hiervoor is het instellen van een ACL, je geeft bij de ACL aan dat admins, SYSTEM, en de user zelf rechten hebben op deze printer, en zodoende is ie alleen voor deze accounts zichtbaar.

Bij het aanmaken van de printers, geef ik een security descriptor mee, met bovenstaande rechten, en vervolgens roep ik AddPrinter() aan. Het creeeren van de ACL doe ik in deze stappen:

- InitializeSecurityDescriptor()
- 3 x LookupAccountName() (SYSTEM, Username, Administrators)
- 3 x AllocateAndInitializeSid()
- InitializeAcl()
- 3 x AddAccessAllowedAce()
- SetSecurityDescriptorDacl()

De code van AddAccessAllowedAce() ziet er ongeveer zo uit:
Delphi:
1
2
3
4
  if NOT AddAccessAllowedAce(Acl^,                                      { Acl }
                             ACL_REVISION,                   { revision level }
                             PRINTER_ALL_ACCESS,                { access mask }
                             SystemSid) then                            { sid }


Op zich wordt deze ACL goed gecreeerd. Mijn probleem is echter dat als je in de ACL editor (gui) van Windows zelf gaat kijken, de rechten gedefinieerd staan als "Special Permissions". Hier zou eigenlijk "Full controll" moeten staan.

Het resultaat is, dat print jobs in de queue blijven staan waardoor ze pas bij een herstart van de spooler verdwijnen (dit is vnl. kosmetisch, maar veroorzaakt verwarring bij de eind gebruiker, en het neemt diskspace in gebruik van de spool files die blijven staan).

Ik heb met meerdere ACL dump tooltjes de ACL/ACE's gedumpt, maar beide ACL's zijn dan vrijwel compatible met de mijne. Alleen het tooltje PrnAcl geeft iets anders aan (nl: voor elke user 2 keer een PRINTER_ALL_ACCESS right terwijl mijn ACL die maar 1 keer bevat). Uiteraard heb ik ook allerlei andere access masks (GENERIC_ALL_ACCESS, PRINTER_ACCESS_ADMINISTER e.d.) geprobeerd, maar niets lijkt de oplossing te zijn.

Het vreemde is wel, dat PRINTER_ALL_ACCESS wel degelijk herkend wordt door de ACL editor, geef ik als accessmask namelijk een willekeurige waarde in, dan krijg je een melding dat de ACL's niet compatible zijn.

Deze usenet post omschrijft een dezelfde probleem (maar die poster gebruikt een andere manier van de ACL bouwen).

Een logische reactie is om te roepen dat dit in de MSDN staat, maar ik heb al behoorlijk wat gezocht de afgelopen weken, maar ik schijn er al enkele weken over heen te kijken.

De specifieke code die de DACL creeert, kan je hier downloaden: security.pas

Is er iemand die enig idee heeft hoe wel een "perfecte" ACL te creeren, zowel onder NT4 als onder Windows 2000 en hoger ?

[ Voor 0% gewijzigd door elevator op 11-11-2002 18:23 . Reden: foute url ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Geen idee, maar heb je al gekeken naar http://www.wilsonc.demon.co.uk/delphi.htm ? Misschien doet die het beter...

We adore chaos because we like to restore order - M.C. Escher


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
Thnx voor je reply, maar die componenten bevatten meer generieke ACL bouwstenen (iets wat ik al heb), maar doet geen printer specifieke dingen.

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
Even een subtiele *schop*

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
Ik heb na wat extra lezen als wanhoopspoging de code aangepast dat de DACL via SetSecurityInfo() gezet wordt, aangezien bij Securable Objects printers specifiek vernoemd worden.

Je krijgt dan code die ziet er uit als:

Delphi:
1
2
3
4
5
6
7
                SetSecurityInfo(TmpPrnHandle,               { Printer Handle }
                                SE_PRINTER,                    { Object type }
                                DACL_SECURITY_INFORMATION,
                                nil,                                 { owner }
                                nil,                         { primary group }
                                ACL,                                  { DACL }
                                nil);                                 { SACL }


Dit zet de security wel (ik creeer de printer met een niet geassignde DACL), maar het probleem blijft.

Niemand enige ervaring met zulk soortige problemen?

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
Ik heb nu door dat de permissies in Win2000 gezet worden op alles, behalve manage documents. Ik kan me dus voorstellen dat documents (de print jobs zelf) aparte objecten zijn die dus de permissies moeten inheriten.

Ik ben dus aan de slag gegaan met inheritance, maar schijnbaar is dit niet geimplementeerd in NT4.

* elevator is een klein beetje door ideeen heen :'( :'(

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
Ik dacht, ik vraag het ook eens in een specifieke newsgroup van Microsoft. Die post kan je hier nalezen.

Tot nu toe heb ik daar ook geen antwoord mogen ontvangen, maar hier moet vast iemand zijn die het weet :)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17-04 15:34

Tomatoman

Fulltime prutser

Helaas kan ik je absoluut niet op weg helpen, maar aan je postings hier in P&W ligt het niet. Die omschrijven je probleem duidelijk. Nu maar stug blijven wachten op een antwoord dat je op weg helpt en zo nu en dan een schopje :)

Een goede grap mag vrienden kosten.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 09:31

curry684

left part of the evil twins

Elevator houdt van in zichzelf praten zo te zien :P Ik post hier ff een nutteloze reply (zoals je weet van IRC zijn ACL's een van de weinige dingen in Win32 waarbij ik totaal niet behulpzaam kan zijn), maja nu sta je iig in m'n searchlijst en kan ik het topic in de gaten houden.

Stukje wel on-topic: permission inheritance zou onder NT4 even perfect moeten werken als onder 2000, ergo blijkbaar doe je daar iets fout...

Professionele website nodig?


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
Even een subtiele *schop*

Permission inheritance zou idd moeten werken, maar ik kan geen API's vinden die zowel onder NT4 als 2000 zouden moeten werken. Ik heb wel API's gevonden die onder NT4/SP3 zouden moeten werken, maar die worden veelal afgedaan als extreem buggy.

  • spook
  • Registratie: Oktober 2000
  • Niet online
Windows NT kent nog geen inheritance is pas gekomen in Windows 2000.
Met de rest kan ik je helaas niet helpen.

(c) GO - Respect verdien je niet door een status die je hebt, maar door het gedrag wat je laat zien.
Life is a Joke!, but not all jokes are funny.


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 17-04 18:07
heb je al gekeken naar e numerieke waarde van 'PRINTER_ALL_ACCESS'? En de numerieke waarde zoals de dumptooltjes die aangeven?
En kan je misschien in je code 'PRINTER_ALL_ACCESS' vervangen door de waarde zoals die wordt aangeven door je dumptooltje?

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Topicstarter
elevator schreef op 22 December 2002 @ 13:50:
Permission inheritance zou idd moeten werken, maar ik kan geen API's vinden die zowel onder NT4 als 2000 zouden moeten werken. Ik heb wel API's gevonden die onder NT4/SP3 zouden moeten werken, maar die worden veelal afgedaan als extreem buggy.
Na flink wat zoeken, heb ik uiteindelijk toch de oplossing gevonden, zonder SDDL te gebruiken.

Permission inheritance was maar een gedeelte van het probleem, en bleek uiteindelijk erg simpel om op te lossen. Als je de AddAccessAllowedAce() code, verandert door een call naar AddAccessAllowedAceEx(), dan kan je inheritance flags meegeven. Na wat experimenteren hiermee, kwam ik erachter dat je hiermee inderdaad de permissies ook kon laten gelden voor Documents (documents zijn objecten die permissies inheriten van het printer object).

Toen was het alleen nog een kwestie van zoeken naar de exacte permissies, hiervoor heb ik SetAcl (http://setacl.sourceforge.net) gebruikt. Ik heb een dump gemaakt van de permissies die er standaard in staan, en vervolgens dit vertaalt naar de manier waarop ik ACL's zet.

Uiteindelijk kom je dus op deze code uit:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const
  OBJECT_INHERIT_ACE       = $01;
  CONTAINER_INHERIT_ACE    = $02;
  INHERIT_ONLY_ACE         = $08;

const
  ACCESS_DELETE            = ($00010000);
  JOB_ACCESS_READ          = ($00000020);


  // Set permissions on the printer object itself
  if NOT AddAccessAllowedAceEx(Acl^,                                    { Acl }
                               ACL_REVISION,                 { revision level }
                               0,                            { no inheritance }
                               PRINTER_ACCESS_ADMINISTER OR PRINTER_ACCESS_USE OR
                                 READ_CONTROL OR WRITE_OWNER OR WRITE_DAC OR ACCESS_DELETE,
                               Sid) then                                { sid }
  { ... };

  // this ACL gives "Manage documents" permissions on the jobs itself
  if NOT AddAccessAllowedAceEx(Acl^,                                      { Acl }
                             ACL_REVISION,                   { revision level }
                             OBJECT_INHERIT_ACE OR INHERIT_ONLY_ACE,
                             JOB_ACCESS_ADMINISTER OR JOB_ACCESS_READ OR
                               READ_CONTROL OR WRITE_OWNER OR WRITE_DAC OR ACCESS_DELETE,
                             Sid) then                                  { sid }


hiermee krijg je dus "Full Control" op zowel de printer, als op de documenten.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 09:31

curry684

left part of the evil twins

elevator schreef op 18 april 2003 @ 10:55:
Na flink wat zoeken, heb ik uiteindelijk toch de oplossing gevonden, zonder SDDL te gebruiken.
4 maanden gezocht, wauw :P

Professionele website nodig?

Pagina: 1