Przeprowadzka

April 8th, 2009

Przeniosłem się z blogiem technicznym na w-files. Tutaj już nie ma czego szukać.

Usunięcie członków grup z danego OU

February 28th, 2009

Skrypt:
-znajduje wszystkie grupy z danego OU, których nazwy pasują do wzorca
-zamienia grupy na dystrybucyjne
-usuwa wszystkich członków z grup


$dom = “LDAP://OU=grupy,OU=studenci,DC=pjwstk,DC=edu,DC=pl“;
#search path
$Root = New-Object DirectoryServices.DirectoryEntry $Dom
$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter = "(&(objectClass=Group))";
$groups = $searcher.findAll();

foreach ($group in $groups)
{
$de = New-Object DirectoryServices.DirectoryEntry $group.Path;
if ($de.Name -match "^[W][A-Z][A-Z]*"){
$de.Name
dsmod group $de.distinguishedName -secgrp no
$members = @()
foreach ($user in $de.member){
$members = $members + $user
}
foreach ($user in $members){
$de.member.Remove($user)
}
$de.SetInfo()

}
}

Odzyskiwanie skasowanego obiektu w AD bez wchodzenia w Restore Mode

December 4th, 2008

Skasowałem przez przypadek/lamerstwo dwa konta w AD i wypadało je odzyskać.

Krok 1
Na szczęście udało się odnaleźć GC na którym konto jeszcze było więc trzeba było na nim szybko wyłączyć replikację:
Support tools (zainstalowane zawczasu :) ) -> repadmin /options nazwakontrolera +DISABLE_INBOUND_REPL
i zrobić authoritative restore. Aby zrobić authoritative restore trzeba odpalić kontoroler w trybie restore i tu pojawił się problem bo kontroler stoi jakieś 300 km ode mnie i jest jedynym kontrolerem w odległym site (jednocześnie jedynym, który ma mój obiekt), mała próba oszukania kontrolera poprzez wpisanie w cmd "set SAFEBOOT_OPTION=DSREPAIR" niestety nie pomogła, mogłem jeszcze kombinować z zatrzymywaniem usług ale… 300km i brak administratora na miejscu mówiły żeby opanować się z tego typu pomysłami (Jarku kiedy mi wystawisz DRACa na Firewallu? :p )

Krok 2
Opcją drugą (co prawda nie supportowaną) jest odzyskiwanie obiektów z tombestone o czym na szczęście udało mi się kiedyś dowiedzieć a teraz sprawdzić to w praktyce. W trakcie kasowania obiektu w AD ten w rzeczywistości nie jest usuwany a jedynie czyszczony z niektórych atrybutów, usuwany z grup i przenoszony do cn=deleted Objects,dc=nazwa,dc=domeny (standardowe narzędzia nie pokazują tego kontenera). Ponadto skasowany obiekt dostaje atrybut isDeleted. Wystarczy tylko dostać się do bazy LDAP przez ldp.exe (znowu support tools), przenieść obiekt na jego poprzednie miejsce i usunąć mu atrybut isDeleted, opis czynności można znaleźć chociażby na petri.co.il. Problemem jest to, że taki obiekt po tej operacji jest dość mocno okrojony ale za to cały czas ma swojego SID’a (a to w tym przypadku było kluczowe).

Krok 3
Użytkownikowi trzeba ustawić nowe hasło, przekopiować wszystkie atrybuty z kontrolera na którym obiekt się zachował (ja to zrobiłem ręcznie przez ADSI Edit ale pewnie można to ładnie oskryptować co dla dwóch kont nie miało sensu), dodać go do grup w których był (nie wystarczy skopiować pola memberOf bo to tylko back-linki-dzięki za informacje Tomku)

Krok 4
Włączyć replikację wyłączoną w pierwszym kroku repadmin /options nazwakontrolera -DISABLE_INBOUND_REPL

Prawdopodobnie da radę zrobic to wszystko mniej inwazyjnie kombinując z numerami seryjnymi obiektów na kontrolerze z wyłączoną replikacją ale nie wiedziałem jak to zrobić więc musiałem zadowolić się tym co umiałem.

 p.s.
Exch 2007 jest totalnie zintegrowany z domeną i usuwając userowi skrzynkę poprzez delete kasuje się też obiekt usera z AD, do skasowania samej skrzynki służy opcja disable :)

Exchange na W2k8

December 3rd, 2008

Niby wszystko proste, domena z Exchane 2003, rozszerzonym schematem itp. Stawiam nowy serwer Exchange 2007 na Windows Server 2008.
Serwer przygotowany do instalacji zgodnie z tym co jest napisane w dokumencie How to Install Exchange 2007 SP1 Prerequisites on Windows Server 2008 or Windows Vista. Pora przygotować domenę, więc uruchamiam cmd (Run as administrator), wpisuję runas /U:LoginEnterpriseAdmina cmd i w nowym cmd piszę setup /PrepareLegacyExchangePermissions tylko po to aby zaraz zobaczyć komunikat:

Setup failed due to insufficient permissions. Please, make sure that the  current user has local administrator permissions. Error: The source was not found but some or all events logs could not be searched. Inacssible logs: security

i ładne okienko debugera z komunikatem o wykrzaczonej aplikacji.

Rozwiązanie (którego nie udało mi się znaleźć w dokumentacji):
-zalogować się jako Enterprise admin na komputerze bo runas nie działa :/

Po raz kolejny przekonałem się o tym, że UAC jest źle działającym mechanizmem ale mimo to cały czas twierdzę, że nie należy go wyłączać.

Grupowa zamiana grup na dystrybucyjne

October 14th, 2008

Dla własnej pamięci, bez opisu. 

$dom = “LDAP://OU=grupy,OU=studenci,DC=pjwstk,DC=edu,DC=pl“;    #search path
$Root = New-Object DirectoryServices.DirectoryEntry $Dom
$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter =  "(&(objectClass=Group))";
$groups = $searcher.findAll();

foreach ($group in $groups)
{
  $de = New-Object DirectoryServices.DirectoryEntry $group.Path;
  if ($de.Name -match "^[W][A-Z][A-Z]*"){
   $de.Name
    dsmod group $de.distinguishedName -secgrp no 
    }
}

backup SVN (Windows + Apache)

July 10th, 2008

Jako, że nie da się backupować bezpośrednio będących on-line repozytorii SVN, trzeba był napisać prosty skrypt, który najpierw zrobi ich hotcopy.

' SVNbackup.vbs
' Backups all SVN repositories from selected directory + Apache config
' Author Kuba Siatkowski http://interkreacja.pl/techniczny
‘ ver 1.0.1

optionexplicit Const FOR_READING = 1 Dim strReposFolder, colReposFolders, strBackupFolder, colBackupFolders, strBackupLocation, strApacheLocDim objFSO,WshShell, objReposFolder, objBackupFolder, objSubFolder, objSubBackupFolder, strBackupset, fileBackupset   strReposFolder = “C:\RepositorySVN” ‘ place where all SVN repos are
strBackupFolder = “C:\backup\” ‘ temp folder for local backups
strBackupLocation = “\\backupserver\backupshare\backupname.bkf” ‘place for backups
strApacheLoc = “C:\Apache\” ‘apache directory (SVN configs, plug-ins etc)
strBackupset = strBackupFolder&“backupset.bks”

 

Set objFSO = CreateObject(“Scripting.FileSystemObject”)
Set WshShell = WScript.CreateObject(“WScript.Shell”)
Set objReposFolder = objFSO.GetFolder(strReposFolder)
Set colReposFolders = objReposFolder.SubFoldersSet
objBackupFolder = objFSO.GetFolder(strBackupFolder)
Set colBackupFolders = objBackupFolder.SubFoldersSet
fileBackupset = objFSO.CreateTextFile(strBackupset, True)
‘delete old backups from temp folder
For Each objSubBackupFolder In colBackupFolders

objSubBackupFolder.Delete True

Next ‘hotcopy all repos from reposdir and create backupset
For Each objSubFolder In colReposFolders

 

WshShell.run “svnadmin.exe hotcopy “&strReposFolder&“\”&objSubFolder.Name&” “&strBackupFolder&objSubFolder.Name, 1, true
fileBackupset.WriteLine “”&strBackupFolder&objSubFolder.Name&“\”

Next ‘add Apache to backupset
fileBackupset.WriteLine “”&strApacheLoc fileBackupset.close ‘do the backup
WshShell.run “ntbackup.exe backup @”&strBackupset& ” /n “”SVN Repos “&Now&“”" /v:yes /r:no /rs:no /hc:off /m normal /j “”SvnBackup”" /l:s /f “&strBackupLocation, , true

 

 

KRB_ERR_RESPONSE_TOO_BIG

July 7th, 2008

Po zabawie z grupami okazało się, że niektórzy użytkownicy nie mogą wysyłać poczty przez linuxowy serwer SMTP.

W logach AD wszystko było w porządku, użytkownicy się uwierzytelniani i generalnie luz malina, do tego IMAP i POP3 działały bez problemu. Za to w logach Linux pojawiało się AUTH_FAIL i nie bardzo było wiadomo o co chodzi. Debug na Linux powiedział, że datagram Kerberos jest za długi a dokładniej serwer Kerberos odpowiadał komunikatem KRB_ERR_RESPONSE_TOO_BIG. Ponoć coś takiego dzieje się jak użytkownik jest w dużej liczbie grup, jednak u nas problem pojawiał się dla niektórych członków pewnej grupy.

Rozwiązanie, którego wyszukanie zajęło Pstrykowi pół dnia:

  1. Ustawić KRB5 tak żeby używał tylko TCP co teoretycznie powinno rozwiązać problem.
    W pliku krb5.conf należy wpisać
    udp_preference_limit = 1
    Jednak mimo tego Linux cały czas usiłował przesyłać datagramy UDP zamiast pakietów TCP :o przez co cały czas Windows odpowiadało KRB_ERR_RESPONSE_TOO_BIG
  2. Zwiększyć na Windowsowym serwerze Kerberos maksymalny rozmiar datagramu UDP
    HKLM\System\CurrentControlSet\Services\Kdc
    Dopisać REG_DWORD MaxDatagramReplySize i wpisać mu odpowiednio dużą wartość (my wpisaliśmy 10000 - standardowo jest to 2000)
  3. Restart Windows i cieszyć się, że działa :)

Wada: nie róbcie tego na kiepskich łączach bo Kerberos się zagubi jak mu będą ginąć datagramy. U nas to stoi w wydzielonym VLAN do kerberosa pomiędzy serwerem poczty a kontrolerem domeny więc nie ma tego problemu.

Nie ma linków popierających bo to kompilacja dużej liczby artykułów :)
BTW na połączeniu Mac OS X - AD problem też występuje

tftp na os x

June 5th, 2008

łatwe do wygooglania ale miło jest mieć wszystko w jednym miejscu. Mocno przydatne do update softu i backupu config w sprzecie Cisco

zrodlo

przeklejka ze zrodla:

Copy the file you wish to serve to:

/private/tftpboot

Then:

sudo launchctl

From the launchd% prompt run:


load -F /System/Library/LaunchDaemons/tftp.plist
start com.apple.tftpd

And when you’re done using the server just:

stop com.apple.tftpd
unload load -F /System/Library/LaunchDaemons/tftp.plist

MUI - szybka zmiana języka

June 4th, 2008

Link do dom3l’4

http://d0m3l.spaces.live.com/blog/cns!A71917DC3B6BF5C1!130.entry

Ponoć mieszałem w tym palce ale ja tylko rzuciłem dwa - trzy pomysły :)

Wada:
Nie przełącza języka odpalonych aplikacji, jedynie Explorera, aplikacje wymagają restartu

Zaleta:
Nie wymaga przelogowywania (i stąd się bierze powyższa wada)

A miało być tak pięknie

May 3rd, 2008

Spojrzałem na reklamę IBM kontra MacBook Air umieszczoną na w2k.pl i przypomniało mi się co kiedyś pokazywało apple :) Szkoda tylko, że Maci są coraz mniej wyjątkowe i że stoi za nimi coraz więcej marketingu i coraz mniej najlepszego designu :-( Tak, apple schodzi na psy. Gdzie podziało się prawdziwe pionierstwo? Czemu flagowym produktem jest zacofany technologicznie i uzależniony od zakupów w iTunes iPhone?

Tak dla przypomnienia jaką idę zabili z razem z wypuszczeniem Air’a?

A co mamy teraz

itcore.pl

April 21st, 2008

NIe dość, że jest brzydsze i wolniejsze od wss.pl to w trakcie migracji zrobili mi z nicka jesień średniowiecza a kiedy chce się zalogować to widzę

Przejdź wstecz do witryny

Błąd

 

Nieznany błąd Rozwiązywanie problemów z programem Windows SharePoint Services.

Czyżby czekała nas kolejna porażka? :-/

Link do zapamiętania

April 16th, 2008

Co prawda już siedzę na 2008 ale jeszcze większość infrastruktury stoi na 2003. Do przeczytania przed migracją 2008 Step-by-Step Guides

Przenoszenie nieaktywnych kont do innego OU

April 4th, 2008

Trzeba było znaleźć wszystkich użytkowników, którzy nie logowali się od dłuższego czasu i przenieść ich do innego OU.
Problemy jakie się pojawiły to wartość atrybutu LastLogonTimeStamp, która jest specyficzna (liczba milisekund od epoki) i przenoszenie obiektów w AD. O ile pierwsze było proste do wygooglania a tyle z drugim strasznie ludzie kombinują, piszą miliony linii kodu i generalnie żadne z tych rozwiązań mi się nie podobało. Chwila samodzielnego kombinowania, trochę rzeźby i olśnienie w postaci, że PowerShell to przecież… shell :) i że działają w nim komendy commandlinowe takie jak np. dsmove :)

Poniżej skrypt, który znajduje wszystkich z OU studenci, którzy nie logowali się od 14 miesięcy i przenosi ich od OU inactive.

# script finds all users in specified OU who haven’t logged for last n months # and moves theirs accounts to another OU # Author Kuba Siatkowski http://interkreacja.pl/techniczny $howoldallowed = 14; #maximum time since last logon (months) $dom = LDAP://OU=studenci,DC=pjwstk,DC=edu,DC=pl; #search path $newparent = OU=inactive,DC=pjwstk,DC=edu,DC=pl; #destination path for unused accounts #$Root = New-Object DirectoryServices.DirectoryEntry $strROOT $Root = New-Object DirectoryServices.DirectoryEntry $Dom $Searcher = New-Object DirectoryServices.DirectorySearcher $Searcher.SearchRoot = $root $searcher.Filter = (&(objectClass=User)(!(objectClass=Computer))); $users = $searcher.findAll(); $lastallowed = [DateTime]::Now.AddMonths($howoldallowed * (-1)); foreach ($user in $users) { if (!($user.Properties.lastlogontimestamp -eq $Null)){ $lastlogon = [DateTime]::FromFileTime([Int64]::Parse($user.Properties.lastlogontimestamp)); if (($lastlogon -lt $lastallowed)){ write-host $user.Properties.cn ; -NoNewLine; write-host $lastlogon ; -NoNewLine; write-host $user.Properties.distinguishedname; dsmove $de.distinguishedName -newparent $newparent } } else { write-host $user.Properties.cn never logged on; } }