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:
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 ?
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 ]