2008-07-24

Ach ten Sharepoint.._

...aneb pokracovani sagy o presmerovani slozek.

Presmerovani dokumentu pomoci zapisu do registru se nam podarilo, ale pak jsme zjistili nemilou vec - ze totiz Sharepoint pri vytvareni My Site sice pouziva username, ale pokud je v nem tecka (.), nahradi ji podtrzitkem (_). Pro nazornost:

Uzivatel s loginem 'pepa' bude mit My Site URL 'http://sharepoint/personal/pepa/'.
Uzivatel s loginem 'pepa.novak' bude mit My Site URL 'http://sharepoint/personal/pepa_novak/'.

Proc to pisu? Protoze jsme ty My Documents potrebovali presmerovat prave do slozky v sharepointim My Site, konkretne 'Personal Documents'. Myslenka krasna, lec zaludna...

Dobra, kdyz nemuzu pouzit %username%, tak holt skriptem. Jenze ouha, VBScript na W2k8, to tak nejak nejde - takze PowerShell. To prece nemuze bejt tezky...

Takze prvne - jak v PS zjistim login a nahradim v nem tecku? Bohuzel, %username% v PS neni a Get-Variable vrati vsechno mozny, jen ne promennou s loginem. Ok, trocha googleni a vztekani se, kdyz zapomenete, ze tecka je wildchar a mame prvni cast za sebou:

$usr = (Gwmi Win32_ComputerSystem -Comp ".").username
$usr = $usr.substring($usr.indexof("\\") + 1, $usr.length - $usr.indexof("\\") - 1)
$usr = $usr -replace("\\.","_")

Vysledkem je upravena verze loginu (obsahuje-li tecky, jsou nahrazeny podtrzitkama). Takze ted uz jenom zapsat to registru:

$docpath = "\\\\sharepoint\\persnal\\" + $usr + "\\personal documents"
Set-ItemProperty -path "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" -name "Personal" -value $docpath
Set-ItemProperty -path "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders" -name "Personal" -value $docpath

Prima, vyzkousime. Preklem v loginu pri prihlaseni (misto 'testik2' pisu 'testik3') ukaze nemilou vec - kdyz uzivatel nema jeste My Site vytvoreny, presmerujou se My Documents tak akorat... vite kam...

Takze hledam, az najdu ADSI atribut wWWHomePage, ktery si Sharepoint pouziva pro ulozeni URL My Site. Nojo, jak zjisit aktualni login, to uz vim, ale jak ziskat ten atribut? Strejda Google je vsemocnej, staci prece jen:

$objusr = Get-User $usr
$url = $objusr.WebPage

Zkusim to a... The term 'Get-User' is not recognized as a cmdlet, function, operable program, or script file. Verify the term and try again.

Kruci, jak to? Aha, Get-User je cmdlet Exchange 2007 snap-inu. OK, to na terminalovy servery instalovat nebudu. Takze jinak - jde to primo pres ADSI? Samozrejme, Google vyplivne tohle:

$objUser = [ADSI]"LDAP://<distinguishedname>"
$objUser.Get("wWWHomePage")

Dobry, ale jak zjistit DN aktualne prihlasenyho uctu? Login bych mel, ale jak prohledavat AD? To je prece jednoduchy:

$query = new-object system.directoryservices.directorysearcher
$query.SearchRoot = [adsi]"LDAP://domain.tld"
$query.filter = "(sAMAccountName=login)"
$query.SearchScope = "subtree"
$result = $query.findOne()
$url = $result.getdirectoryentry().wWWHomePage

Kdyz clovek jeste trochu zagoogli, muze skript upravit, aby si zjistil DNS jmeno domeny a predrtil ho do LDAP tvaru:

$domdn = (Gwmi Win32_ComputerSystem -Comp ".").domain
$domdn = [string]"LDAP://" + $domdn
$domdn = $domdn -replace("//","//DC=")
$domdn = $domdn -replace("\\.",",DC=")

Takze, umime zjistit URL sharepointiho My Site pro aktualne prihlasenyho uzivatele, umime to zapsat do registru, musime to akorat smichat dohromady a pridat podminku, abychom to nervali do registru vsem, ale jen tem, ktery maji My Site. Po dvou hodinach intenzivniho googleni a neustale se opakujicim kolotoci "prihlasit - zkontrolovat - Do prdele! - odhlasit - smazat profil - upravit skript - prihlasit..." jsem nakonec zvitezil:

#ziskame username

$usr = (Gwmi Win32_ComputerSystem -Comp ".").username
$usr = $usr.substring($usr.indexof("\\") + 1, $usr.length - $usr.indexof("\\") - 1)

#ziskame DNS domain a predrtime v LDAP

$domdn = (Gwmi Win32_ComputerSystem -Comp ".").domain
$domdn = [string]"LDAP://" + $domdn
$domdn = $domdn -replace("//","//DC=")
$domdn = $domdn -replace("\\.",",DC=")

#vytvorime ADSI query s rootem v koreni domeny a hledame ucet s prislusnym username

$query = new-object system.directoryservices.directorysearcher
$query.SearchRoot = [adsi]$domdn
$query.filter = "(sAMAccountName=$usr)"
$query.SearchScope = "subtree"

# ziskame atribut wWWHomePage a prilepime k nemu "Personal Documents"

$url = $query.findOne().getdirectoryentry().wWWHomePage.ToString() + "Personal Documents"

# nezbytna podminka...

if ($url -ne "Personal Documents")
{

# predrtime $url na WebDAV cestu

$url = $url -replace("http://","\\\\")
$url = $url -replace("/","\\")

# nalejeme do registru

Set-ItemProperty -path "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders" -name "Personal" -value $url
Set-ItemProperty -path "HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders" -name "Personal" -value $url
}

Dneska se mi o PowerShellu bude asi i zdat...


1 komentář:

  1. Hu......zformatovat ten hle prispevek byla taky celkem \"sranda\"... Slaba pulhodinka :)

    OdpovědětVymazat

Mazat komentáře nehodlám, výjimky však tvoří vulgární a off-topic komentáře!