ASP: Jak zjistit členství uživatele v NTéčkové skupině.Kvůli personalizaci stránek nebo kvůli nastavené přístupových práv v Intranetu se často hodí zjistit, jestli je uživatel připojený k webu členem určité skupiny. Poradíme jak na to s pomocí ADSI a ASP. (Martin Vobr, publikováno ve Světě Namodro) Při tvorbě webových aplikací se často naráží na nutnost personalizace stránek. Zvlášť žhavé je to v intranetech - je zřejmé, že například vedoucí potřebuje vidět v intranetu jiné věci než prodejce a ten zase jiné než technická podpora. Existuje samozřejmě velká spousta možností, jak stránky upravit pro jednotlivé uživatele, většina z nich ale vyžaduje napsání separátních nástrojů na správu přístupových práv. Proč ale pro účel personalizace nepoužít účty z NT serveru? Skupiny a uživatelé kteří do nich patří se editují snadno (přes WinNT UserManager), skupiny jsou většinou už stejně vytvořené (například pro rozlišení přístupu k souborům na serveru), a uživatele který přistupuje na web také snadno zjistíme (když se zapne NTLM autentikace) - takže se zdá že cesta tímto směrem je otevřená. Přístupová práva k jednotlivým stránkám, a/nebo personalizaci jejich obsahu budeme určovat podle příslušnosti uživatele ke skupině založené ve Windows NT. Takový přístup je lákavý, ale má jeden háček. Jak zjistit jestli je uživatel členem určité skupiny? V ASPéčkách na to přímo žádná funkce není. Na webu existutují různé COM objekty, které takovou funkcionalitu poskytují (například NTAccess.Groups), ty ale mají dvě nevýhody:
Naštěstí se dá použít ADSI. ADSI (Active Directory Services Interface) je rozhraní k adresářové službě - dá se použít například k administraci IIS a velice snadno se skriptuje jak z WSH tak z ASPéček. Naštěstí nemusíme čekat na Windows 2000, které jsou ADS a ADSI prorostlé, část funkcí funguje už Windows NT 4. Pokud například chceme zjistit (jak je uvedeno výše) to, zda je uživatel členem určité skupiny stačí otevřít objekt "WinNT://domena/skupina" a zavolat metodu IsMember. Na konci tohoto článku je funkce IsGroupMember, která zapouzdřuje zjišťování
členství uživatele ve skupině. Použití je snadné: <%
dim strDomain
dim strGroup
dim strUser
dim strTemp
' zjisti login uzivatele - pri NTLM autentikaci
' neco jako "DOMENA\UZIVATEL"
strTemp = request.servervariables("LOGON_USER")
' rozparsuj jmeno uzivatele a jmeno domeny
strUser = mid(strTemp, InStr(strTemp,"\")+1)
strDomain = left(strTemp, InStr(strTemp,"\")-1)
' tuto skupinu testujeme
strGroup = "domain admins"
Response.write IsGroupMember & _
(strDomain,strGroup,strUser) & "<br>"
if IsGroupMember(strDomain,"marketing",strUser)_
then
.... kod pro prodejce
end if
if IsGroupMember (strDomain,"vedeni", strUser)_
then
... kod pro vedeni
end if
....
%>
A vlastní funkce:
<%
'@bfunc vraci Zjisti jestli je uzivatel clenem
' urcite globalni skupiny
'@bparm nazev domeny (napriklad "office")
'@bparm nazev skupiny ("napriklad "administrators")
'@bparm login uzivateke (napriklad "hugo")
'@bret True pokud je clenem skupiny,
' False pokud neni
public function _
IsGroupMember(strDomain,strGroup,strUser)
dim dsObj
on error resume next
' vezmi ADSI objekt se skupinou
set dsObj = getObject ("WinNT://" & strDomain _
& "/" & strGroup)
' pri chybe bez pryc
if err <> 0 then
IsGroupMember = false
Exit function
end if
if dsObj.IsMember("WinNT://" & strDomain & _
"/" & strUser) then
IsGroupMember = true
else
IsGroupMember = false
end if
' pri chybe bez pryc
if err <> 0 then
IsGroupMember = false
Exit function
end if
end function
%>
|