.NET security se
mě nějak nechce pustit - tentokrát v kontextu Web Services...
Píšu servis, který zprostředkuje přístup k databázi
Exchange serveru, a píšu
ho v C# - je to můj první Web Service, a tato RPC architektura i programovací
jazyk jsou koneckonců vyvíjené společně, takže by se neměly nijak tlouct.
Neměly...
Můj Web Service implicitně běží jako Network Service, což kupodivu
není "user name" (přinejmenším
log4net tvrdí, že
Principal.Identity.Name
je v tomto kontextu prázdný řetězec),
nýbrž
Windows Identity
NT AUTHORITY\NETWORK SERVICE. Proč je tak složité
získat
pravé jméno? :-)
Network Service může ledacos, ale jednou z věcí, které nezvládá, je otevření
Exchange mailboxu. Network Service nejspíš žádný mailbox nemá (což je jen dobře -
těžko od tohoto účtu očekávat, že si bude číst poštu), jenže selhává, i když se pokusí
otevřít mailbox někoho jiného (a kdyby jen selhával - ani si nestěžuje).
CDO
IDataSource.Open
sice má parametry pro uživatelské jméno a heslo, ale ať jsem tam cpal cokoli,
k ničemu to nevedlo...
Takže jsem se rozhodl sestoupit z výšin .NETu a
impersonovat.
To zafungovalo lépe - dokázal jsem se přihlásit jako administrátor. Jako jiný uživatel ale bohužel nikoli :-(
- volám-li
LogonUser
s parametrem LOGON32_LOGON_INTERACTIVE, vysvětlí mi server, že obyčejní
uživatelé nemají na interaktivní přihlášení nárok, zatímco použiju-li
LOGON32_LOGON_NETWORK, dozvím se od .NETu, že vzdálení uživatelé nemají
co natahovat dynamické knihovny:
System.IO.FileLoadException: Access is denied: 'ADODB'.
Člověk by očekával, že tyto dvě operace se dají provést odděleně, pod různými účty - ale
dosud je mi to nepovedlo...