Wirtualne wizytówki

Pojawiło się coś co ma załagodzić żal po stracie papierowych certyfikatów. Jak na razie wygląda to cienko i nie można wysłać własnego avatara z Maca, niezależnie od tego w jakim formacie jest grafika dostaję komunikat, że nie jest to właściwy format ;).
Tak mają wyglądać wirtualne wizytówki

…też już mam ;)

Edit:

Jeszcze trochę pomarudzę:
-Avatary: jak dla mnie jakaś porażka. Podanie linku do Avatara wstawi go na wizytówce jako zewnętrzny obrazek. Żadnego skalowania, rozmiar jest zmieniony za pomocą tagów w HTML, jeśli obrazek nie jest wystawiony po https z zaufanym certyfikatem to przeglądarka będzie krzyczała o naruszeniu bezpieczeństwa.
-Logowanie: Windows Live ID, które jest normą w świecie M$. Wszystko jest super tylko czemu jak przyjdziemy z Live ID innym niż to do którego jest podpięte MCP to nie możemy się przelogować. Czy tak trudno dodać przycisk Sign Out na stronie z błędem?
-Wygląd wizytówek: czemu nie możemy wysłać własnej grafiki, która pokaże się po lewej stronie ani wybrać kolorów tekstu?
-Transcript: czemu skoro M$ dysponuje naszymi transkryptami i bardzo chce nam je dawać w XPS to tutaj oczekuję, że będziemy robić upload transkryptu w PDF?

Czemu nie lubię produktów Adobe

Czy ktoś mi może powiedzieć czemu firma produkująca tak nieprzewidywalne produkty utrzymuje się jeszcze na rynku i czy w ogóle testują pakiety przed wypuszczeniem na rynek?

Jakiś czas temu walczyłem z tym, że część produktów z pakietu Adobe CS 2 uruchamiała się a inne zupełnie nie chciały. Przesiedziałem parę dni z filemonitorem i regmonitorem tylko po to aby później dowiedzieć się, że Adobe Encore nie działa jak zmieni się liczbę ostatnio otwartych dokumentów w Menu Start :o a After Effects działa bardzo niestabilnie kiedy na komputerze jest ustawiony Active Desktop.

Dzisiaj Adobe znowu mnie niemiło zaskoczyło mieszając mi w routingu… ale po kolei.
Okazało się, że ze swojego komputera nie mogę dostać się poprzez tunel do drugiego site. Normalnie powinno działać to tak: wysyłam pakiet do default gw (switch 3 warstwy), ten przesyła pakiet do serwera VPN i dalej dane idą po tunelu IPSEC. Jednocześnie switch wysyła mi ICMP redirect przez co aktualizuje moją tablicę routingu tak abym pakiety do Site B kierował prosto do serwera VPN i nie obciążał switcha (wszystko jest w jednej sieci IP).
Kawałek sieci, który nas interesuje jest pokazany na obrazku poniżej.

Drawing

Po chwili zabawy Wireshark okazało się, że pakiety wychodzące poza moją sieć zamiast być kierowane do default gateway są kierowane bezpośrednio na interfejs. Lekko się zdziwiłem jak zobaczyłem ARP Who has 89.161.235.41 wysyłane do sieci 10.0.0.0/8 a switch, jako że ma włączone ARP Proxy, odpowiadał swoim MAC i wszystko działało. Problem pojawiał się przy VPN bo tam nie ma APR Proxy i gdyby nie to pewnie do tej pory żył bym w błogiej nieświadomości, ze coś jest u mnie nie tak z tablicą routingu.

Dalsze poszukiwania pokazały mi coś co wcześniej przeoczyłem a mianowicie:

Z:>route print
===========================================================================
Interface List
11...00 21 9b 7b 15 66 ......Intel(R) 82566DM-2 Gigabit Network Connection
  1...........................Software Loopback Interface 1
12...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
===========================================================================

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric 
            0.0.0.0        0.0.0.0          0.0.0.0       10.2.2.25      20
            0.0.0.0        0.0.0.0         10.0.1.2       10.2.2.25      20 
           10.0.0.0      255.0.0.0          On-link      10.2.2.25     276

Do tego:

Z:>ipconfig

Windows IP Configuration

Ethernet adapter Local Area Connection:

   Connection-specific DNS Suffix  . : pjwstk.edu.pl
   IPv6 Address. . . . . . . . . . . : 2001:808:102:0:ecac:56b:bad:ac1d
   IPv6 Address. . . . . . . . . . . : 2001:808:102:0:ecac:56b:1bed:c4c4
   Link-local IPv6 Address . . . . . : fe80::ecac:56b:1bed:c4c4%11
   IPv4 Address. . . . . . . . . . . : 10.2.2.25
   Subnet Mask . . . . . . . . . . . : 255.0.0.0
   Default Gateway . . . . . . . . . : fe80::208:a1ff:fe9e:d4f7%11
                                       2001:808:102::1
                                       0.0.0.0
                                       10.0.1.2

Początkowo pomyślałem że jest coś nie tak z konfiguracją DHCP i próbowałem zmienić statycznie default gateway, jednak GUI konfiguracji interfejsu zdawało się mnie ignorować, to samo z poleceniami route i netsh. No ładnie mam wirusa… tylko jak skąd i w ogóle. Jedyne co było pozytywne w tych myślach to plan dokuczania d0m3l0w1, że Forefront coś przepuścił ;-) Ale po bingowaniu okazało się, że problem jest znany i powodowany przez … Adobe CS 3 i klienta Apple Bonjour którego ten instaluje. Zatrzymałem serwis Bonjour, zrestartowałem sieć… kupa dalej nie działa. Dopiero całkowicie pozbycie się tego badziewia rozwiązało mój problem.
Gdyby ktoś również potrzebował się tego pozbyć to trzeba uruchomić

“%PROGRAMFILES%BonjourmDNSResponder.exe” –remove

Zrestartować komputer po czym usunąć katalog %PROGRAMFILES%Bonjour

Po tych zabiegach znowu panuję nad routingiem na swoim komputerze :-) Z tego co wyczytałem problem dotyczy wszystkich wersji Windows od Vista w górę i nie został usunięty w CS4. Ot taki skomasowany atak Adobe i Apple na Microsoft ;)

OneNote za darmo

Teoretycznie program trzeba kupić ale jest jeden mały myk, który pozwala go ściągnąć za darmo (i nie mam tu na myśli P2P :) ). Mianowicie program jest składnikiem pakietu SharePoint Designer 2007, który od 1 kwietnia można ściągać za darmo. Wystarczy wejść na stronę http://www.microsoft.com/downloads/details.aspx?familyid=baa3ad86-bfc1-4bd4-9812-d9e710d44f42 , zarejestrować się, ściągnąc i cieszyć się aplikacją :)

Edit:

Sądząć po komentarzach, mam farta . Poniżej screenshot na potwierdzenie, że u mnie działa. Zarówno wersja EN jak i PL chce się instalować z OneNote.

onenote.jpg

Scheduler, PowerShell i “run with highest privileges”

W trakcie przenosin pomiędzy dwoma Windows Server 2008 musiałem przenieść zadania schedulera. Maszyny jota w jotę identyczne, zadania przeniesione przez „Import task…” wszystko się udało, zadania się uruchamiają kończą bez błędu. Jedyny problem jest taki, że skrypty PowerShell… nie działają, tzn kończą się poprawnie ale nie wykonują tego co mają zrobić.

Po dłuższym poszukiwaniu okazało się, że ustawienie „run with highest privileges” nie przenosi się w trakcie importu co zaowocowało tym, że z PowerShell:

  1. działały zapytanie do SQL Server
  2. można było czytać i pisać w AD
  3. nie można było nawiązać sesji Remote PowerShell ( New-PSSession )

Zaznaczyłem tick przy „run with highest privileges” i wszystko działa.

Po raz kolejny twierdzę, że UAC w Windows Server 2oo8 i Vista nie działa tak jak bym tego oczekiwał :-/, co nie oznacza, że popieram wyłączanie.

Backup SVN (Windows + Apache)

Jako, że nie da się backupować bezpośrednio repozytorii SVN będących on-line, trzeba było napisać prosty skrypt, który najpierw zrobi ich hotcopy a dopiero potem backup na zadaną lokalizację sieciową. Zamiast robienia backup set i używania ntbackup można spakować cały folder docelowy i przegrać go zwykłym xcopy, w sumie wyjdzie na to samo a pewnie będzie szybciej i prościej do odzyskiwania.

Środowisko:
Windows Server 2003
Apache 2.2 z modułem SVN

' SVNbackup.vbs
' Backups all SVN repositories from selected directory + Apache config
' Author Kuba Siatkowski https://w-files.pl/author/kfaz
' 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 = "\backupserverbackupsharebackupname.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

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
    HKLMSystemCurrentControlSetServicesKdc
    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

A miało być tak pięknie

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.

Ktoś pamięta to?

A co mamy teraz

Przenoszenie nieaktywnych kont do innego OU

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 o 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 w danym OU , którzy nie logowali się od 14 miesięcy i przenosi ich od OU inactive. Minimalne wymagania: domena w trybie “Windows Server 2003”

# 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/
$howoldallowed = 14; #maximum time since last logon (months) $dom ="LDAP://OU=sourceou,DC=yourdomain,DC=com,DC=pl"; #search path $newparent ="OU=inactive,DC=yourdomain,DC=com,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; } }

Ustawianie msSFU30GidNumber dla wszystkich grup w domenie

Linuxy potrzebują parametru msSFU30GidNumber żeby widziały grupy z Active Directory. Do tej pory pojedyńcze MsSFUGidy robiliśmy ręcznie z ADSIEdit, jednak kiedy przyszło ponad sto nowych grup to trzeba było to jakoś oskryptować.

Skrypt poniżej:

  1. znajduje maksymalny MsSFUGid w domenie
  2. wszystkim grupom, które nie mają msSFUGID przypisuje kolejne numery 

Jego wadą jest to, że dodaje Gidy wszystkim grupom ale to można zmienić np. poprzez ustawienie odpowiedniego roota przed drugą pętla.

$Root = New-Object DirectoryServices.DirectoryEntry $strROOT
$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter =  "(&(objectClass=Group))";
$numer = 0;
$gid ;
$groups = $searcher.findAll();
foreach ($group in $groups)
{
   $de = New-Object DirectoryServices.DirectoryEntry $group.Path;
   $gid = [int]$de.msSFU30GidNumber.ToString();
#  write-host $gid ";" -NoNewLine;
#  write-host $de.name;
   if ($numer -lt $gid )
   {
     $numer = $gid;
#    $numer;
   }
}
$numer++;

foreach ($group in $groups)
{
  $de = New-Object DirectoryServices.DirectoryEntry $group.Path;
  $gid = [int]$de.msSFU30GidNumber.ToString();
  if ($gid -eq 0)
  {
    $de.msSFU30GidNumber = $numer;
    $de.SetInfo();
    write-host $numer ";" -NoNewLine;
    write-host $de.name;
    $numer++;
  }
}