Ziarniste polityki hasel#

Od lutowego CTP dostępne są ziarniste polityki haseł - czyli możliwość przypisywania polityk haseł do użytkowników/grup globalnych. Główne cechy nowych polityk to:

  • Polityki Haseł są oparte o obiekty PSO (Password Sttins Objects).
  • Obiekty PSO są połączone z kontami użytkowników/grup globalnych za pomocą mechanizmu forward/backlink, podobnie jak członkostwo w grupie.
  • Wiele obiektów PSO może być podłączonych do jednego obiektu użytkownika, jednak nie będą scalane – tylko jedna polisa będzie aktywna.
  • Jeśli wiele obiektów jest podpiętych do użytkownika, wygrywa ten, który ma najniższy atrybut precedence. Jeśli atrybut precedence jest taki sam w kilku polisach, wygrywa ta, która ma najniższy GUID.
  • Polityki przechowywane są w CN=System,CN=Password Settings Container.
  • Nie przewiduje się wsparcia dla polis na OU w Windows Server Longhorn.

Więcej informacji dotyczących polityk można znaleźć pod tym adresem.

Jako że w obecnej wersji nie istnieje GUI do edycji tych polityk haseł, przygotowałem przykładowy skrypt, który tworzy obiekt Polityki, wszystkie wymagane atrybuty oraz podpina politykę pod konto użytkownika - skrypt znajduje się w załączniku. Oczywiście, podobny efekt można uzyskać, korzystając z wbudowanego ADSIEDIT.

#pobieramy kontener Haseł
$ou=[ADSI]"LDAP://CN=Password Settings Container,CN=System,DC=contoso,DC=local"
#tworzymy obiekt polityki haseł
$policy = $ou.Create("msds-passwordsettings","cn=myPolicy")
$policy.Put("msDS-PasswordSettingsPrecedence","10") #prirytet mniejszy->lepszy
$policy.Put("msDS-PasswordHistoryLength","15")
$policy.Put("msDS-MinimumPasswordLength","12")
$policy.Put("msDS-MinimumPasswordAge","-864000000000") # 1dzień
$policy.Put("msDS-MaximumPasswordAge","-36288000000000") # 42dni
$policy.Put("msDS-LockoutThreshold","0")
$policy.Put("msDS-LockoutObservationWindow","-18000000000") # 8minut
$policy.Put("msDS-LockoutDuration","-18000000000") #8minut
$policy.Put("msDS-PasswordComplexityEnabled",[bool]0)
$policy.Put("msDS-PasswordReversibleEncryptionEnabled",[bool]0)
$policy.SetInfo()
#Dopisanie polisy do użytkownika
$policy.Put("msDS-PSOAppliesTo","CN=peki,CN=Users,DC=contoso,DC=local")
$policy.SetInfo()

Saturday, April 21, 2007 9:36:51 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Poprawianie polskich znaków w DisplayName#

Mieliśmy ostatnio problem z polskimi znakami w displayname - dostaliśmy listę kont do załozenia która była w innym kodowaniu niz zazwyczaj, i automat załozył konta z polskimi znakami w displayName. Niestety Linuxy przy zakladaniu aliasów pocztowych nie poradziły sobie z polskimi znakami, więc mieliśmy ok 100 kont do dodania.

Kfaz po długiej i cięzkiej nauce powershella napisał taki skrypt:

$Root = New-Object DirectoryServices.DirectoryEntry $strROOT
$logname = "Nazwiska";
$logname += get-date -format "yyyyMMdd_hhmmss";
$logname +=".log";

$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter =  "(&(objectClass=User)(!(objectClass=Computer)))";
$users = $searcher.findAll();
$l=0;
$log=@();
$polish = "ą","ć","ę","ł","ń","ó","ś","ź","ż","Ą","Ć","Ę","Ł","Ń","Ó","Ś","Ź","Ż";
$latin = "a","c","e","l","n","o","s","z","z","A","C","E","L","N","O","S","Z","Z"

foreach ($user in $users)
{
 write-host "." -NoNewLine;

 if (([string] $user.properties.displayname) -match "[ąćęłńóśźżĄĆĘŁŃÓŚŹŻ]")
  {
   $de = New-Object DirectoryServices.DirectoryEntry $user.Path;
   $temp = $de.displayName;
   for ($i = 0; $i –lt $polish.count; $i++)
   {
    $temp = ([String]$temp).Replace($polish[$i], $latin[$i]);
   }

   $log+=$de.SAMAccountName +" "+$de.displayName+" "+$temp;
   $de.SAMAccountName;
   $de.displayName;
   $temp;
   echo "-------------------------------------";

   $de.displayName = $temp;
   $de.CommitChanges();
   $l++;
  }
}

echo "Przetworzonych  " $l | out-file $logname -Append
$log | out-file $logname -Append

echo "Przetworzonych  " $l

Thursday, January 04, 2007 12:40:47 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Poprawianie DisplayName#

Po przejrzeniu kilku rekordów userów okazało się, że niektórzy mają w Display Name poustawiane pomiędzy imieniem i nazwiskiem 2 spacje zamiast 1. Aby to skorygować, powstał ten skrypt:

$data=get-date -format g
$comment="[changedDN "+$data+"by PeKi]"
$logname = "changedDN";
$logname += get-date -format "yyyyMMdd_hhmmss";
$logname +=".log";
$l=0
$Root = New-Object DirectoryServices.DirectoryEntry $strROOT
Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter = "(&(objectClass=person)(objectcategory=person)(displayName=* *))";
$users = $searcher.findAll();
$log=@();
foreach ($user in $users)
{
    $de = New-Object DirectoryServices.DirectoryEntry $user.Path;
    $log+=$de.SAMAccountName + " " + $de.displayName
    $de.displayName=([String]$de.displayName).Replace(" "," ")
    $l++
}

echo "Przetworzonych " $l | out-file $logname -Append
$log| out-file $logname -Append

echo "Przetworzonych " $l
$log

A ten skrypt poprawia błąd, w którym nazwisko jest powtórzone 2 razy:

$data=get-date -format g
$comment="[changedDN "+$data+"by PeKi]"
$logname = "changedDNGN";
$logname += get-date -format "yyyyMMdd_hhmmss";
$logname +=".log";

$Root = New-Object DirectoryServices.DirectoryEntry $strROOT
Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter = "(&(objectClass=person)(objectcategory=person)(displayname=* * *)(givenName=* *)(sn=*))";
$users = $searcher.findAll();
$log=@();
$l=0
foreach ($user in $users)
{
    $de = New-Object DirectoryServices.DirectoryEntry $user.Path;
    $gns=([String]$de.givenName).Split(' ')[1].tolower()
    $sn=([String]$de.sn).tolower()
    if ($gns.CompareTo($sn) -eq 0)
    {
    $newGN=([String]$de.givenName).Split(' ')[0];
    $newDN=$newGN+" "+([String]$de.sn)
    $log+=$de.SAMAccountName+ $de.givenName + $de.displayName + $newGN +$newDN
    write-host $l
    $de.givenName=$newGN
    $de.displayName=$newDN
    $l++
    }    
}

echo "Przetworzonych " $l | out-file $logname -Append
$log| out-file $logname -Append

echo "Przetworzonych " $l
$log

Thursday, October 26, 2006 1:30:43 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

CDO.Message w Powershell#

Kiedyś napisałem posta o CDO.Message w VBScripcie , teraz więc pora na Powershella.

$objMessage = new-object -com CDO.Message
$objMessage.From = "`"Krzysztof Pietrzak`" <pkrzysz@nospam.pjwstk.edu.pl>"
$objMessage.To = "pkrzysz@nospam.pjwstk.edu.pl"
$objMessage.Subject = " Message Subject"
$objMessage.TextBody = "Body of message"
# Send using SMTP
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
#SMTP Server
$objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.server.org"
#SMTP Server Port
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
#Authenticaztion 1-Baasic, 2-NTLM
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 2
#Use ssl
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = 0
#Timeout
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60

$objMessage.Configuration.Fields.Update()
$objMessage.Send()

I oczywiście przykład z uzyciem normalnej autoryzacji i SSL/TLS:

$objMessage = new-object -com CDO.Message
$objMessage.From = "`"Krzysztof Pietrzak`" <pkrzysz@nospam.pjwstk.edu.pl>"
$objMessage.To = "pkrzysz@nospam.pjwstk.edu.pl"
$objMessage.Subject = " Message Subject"
$objMessage.TextBody = "Body of message"
# Send using SMTP
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
#SMTP Server
$objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "dfs2"
#SMTP Server Port
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
#Authenticaztion 1-Baasic, 2-NTLM
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
#UserID
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "yourUser"
#Password
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "yourpassword"
#Use ssl
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = 1
#Timeout
$objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60

$objMessage.Configuration.Fields.Update()
$objMessage.Send()


 

Monday, June 05, 2006 10:58:04 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Poprawianie parametrow uzytkownikow#

 Niektórzy użytkownicy nie mieli wpisanych parametrów określających nazwę katalogu domowego, inni nie mieli przypisanego profilu mandatoryjnego na swoje konta. Dlatego napisałem ten skrypcik który poprawił błędy:

$strRoot = "LDAP://OU=studenci,dc=pjwstk,dc=edu,dc=pl"
$logname = "blo";
$logname += get-date -format "yyyyMMdd_hhmmss";
$logname +=".log";

$Root = New-Object DirectoryServices.DirectoryEntry $strROOT
$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root

#zla sciezka i home
$searcher.Filter = "(&(";
$searcher.Filter+= "(&(objectClass=User)(name=s*)(!(name=sT*))(!(homedrive=*))(!(objectClass=Computer)))";
$searcher.Filter+= "(&(objectClass=User)(name=s*)(!(name=sT*))(!(homedirectory=*))(!(objectClass=Computer)))";
$searcher.Filter+= "))";
$usersDir = $searcher.findAll();
$usersDir | out-file $logname
foreach ($user in $usersDir)
{
 $de = New-Object DirectoryServices.DirectoryEntry $user.Path
 $de.homedrive="z:"
 $homename="\\zet\"+$user.Properties.name;
 $de.homedirectory=$homename
 $de.CommitChanges()
}

#Szukamy osoby bez profilu i wpisujemy profil mandatoryjny
$searcher.Filter = "(&(";
$searcher.Filter+= "(&(objectClass=User)(name=s*)(!(name=sT*))(!(profilePath=*))(!(objectClass=Computer)))";
$searcher.Filter+= "))";
$usersPro = $searcher.findAll();
$usersPro | sort-object -property Properties.name
$usersPro | out-file $logname
foreach ($user in $usersPro)
{
 $de = New-Object DirectoryServices.DirectoryEntry $user.Path
 $de.profilepath="c:\documents and settings\mandatory"
 $de.CommitChanges()
}


 

Friday, June 02, 2006 3:39:53 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Powershell i blokada kont#

Przyszła lista kont do zablokowania, oczywiście w formacie .xls.  Jako ze konta powinny być blokowane jak najszybciej, a osoba która sie tym zajmuje ma dzisiaj wolne, na mnie spadł ten obowiązek.

Na początku trzeba było dodać nagłówki do kolumn w excelu, a następnie wyeksportować wynik do pliku .csv.

Następnie w ciągu 3h napisałem taki skrypcik

#configuration

$lista = Import-Csv blokada.csv
$studentOU="OU=studenci,DC=pjwstk,DC=edu,DC=pl"
$data=get-date -format g
$comment="[blocked "+$data+"by PeKi script(dziekanat)]"
$logname = "log";
$logname += get-date -format "yyyyMMdd_hhmmss";
$logname +=".log";

#processing
$log=@();
$notFoundLog=@();
$alreadyDisabled=@();
$l=0
$k=0;
foreach ($user in $lista)
{
$l++;
$stud="LDAP://CN=s"+$user.Album+","+$studentOU;
if ([DirectoryServices.DirectoryEntry]::Exists($stud))
{
$de = new-object DirectoryServices.DirectoryEntry($stud);
$uac=$de.userAccountControl;
$iuac=[int]$uac.toString();
if (($iuac -band 2) -eq 0 )
{
$iuac+=2;
$deLastName=$de.InvokeGet("LastName");
$k++;
$deFirstName=$de.InvokeGet("FirstName");
$deCommonName=$de.InvokeGet("cn");
$deComment=$de.InvokeGet("comment");
$deDescription=$de.InvokeGet("Description");
$date = get-date -format g;
$deComment=$deComment+$comment;
$deDescription=$comment+$deDescription;
$log+= $deCommonName+" "+$deLastName +" " +$deFirstName +" ";

$de.InvokeSet("comment",[string]$deComment);
$de.InvokeSet("Description",[string]$deDescription);
$de.InvokeSet("userAccountControl",[int]$iuac);
$de.CommitChanges();
$de.close();
}
else
{
$alreadyDisabled+= "disabled:"+$user.Album +"uac: " +$uac;
}
}
else
{
$notFoundLog+= "not found:"+$user.Album +" cn: " +$stud ;
}
}

#output
echo "dobrych"| out-file $logname -Append
$log| out-file $logname -Append
echo "zlych"| out-file $logname -Append
$notFoundLog| out-file $logname -Append
$alreadyDisabled| out-file $logname -Append
echo "prztworzonych" $k " z " $l| out-file $logname -Append


write-host "dobrych";
$log
write-host "zlych";
$notFoundLog
$alreadyDisabled
write-host "prztworzonych" $k " z " $l;

Z ciekawszych rzeczy w tym skrypcie widać:

  • deklarację ($param=@()) i zapisywanie do tablicy ($param+="wartosc")
  • porównywanie bitowe za pomocą -band
  • wywołanie statycznej procedury za pomocą [sciezka.do.klasy]::procedura()
  • zapisywanie do pliku za pomocą out-file
Tuesday, May 23, 2006 3:27:58 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

POwershell i paramtry SFU#

Po walcę z grupami w linuxie, pora przyszła aby przejrzeć AD.

Jak się okazało, nie wszystkie grupy windowsowe miały odpowiednie parametry więc pora była na dopisanie tych paramtrów.

Z tego powodu narodził sie ponizszy skrypt:

$strRoot = "LDAP://dc=pjwstk,dc=edu,dc=pl"
$Root = New-Object DirectoryServices.DirectoryEntry $strROOT
$Searcher = New-Object DirectoryServices.DirectorySearcher
$Searcher.SearchRoot = $root
$searcher.Filter = "(&(objectClass=Group))"
$groups = $searcher.findAll();

#get groups with no mssfu30name
foreach ($group in $groups) { if (!$group.Properties.mssfu30name) {write-host $group.Properties.name }}
#print maxgid
foreach ($group in $groups) { if ($group.Properties.mssfu30name) {write-host $group.Properties.mssfu30gidnumber }}
#setMaxgid

$maxgid=0
foreach ($group in $groups)
{
if ($group.Properties.mssfu30gidnumber)
{
$tmp = [int] $group.Properties.mssfu30gidnumber[0]
if ($tmp -gt $maxgid )
{
$maxgid=$tmp;
}
}
};

#set params
foreach ($group in $groups)
{
if (!$group.Properties.mssfu30gidnumber)
{
$maxgid= $maxgid+1
$de = new-object DirectoryServices.DirectoryEntry($group.Path)
$deName=$de.InvokeGet("cn");
$de.InvokeSet("mssfu30name",[string]$deName)
$de.InvokeSet("mssfu30gidnumber",[int]$maxgid)
$de.InvokeSet("mssfu30nisdomain",[string]"pjwstk")
$de.CommitChanges()
$de.close()
}
};



Tuesday, May 16, 2006 6:56:21 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

PowerShell#

Czas się w koncu zabrac za Powershella. Po cięzkiej nauce VBS i batchy CMD raczej podchodzę do tej nowinki niechętnie, ale jak wskazują najnowsze trendy MSH będzie obowiązkowym językiem skryptowym.

Task 1: Mamy schemat katalogów

/-|
   -s3452
   -s3453
   -s4532
   ...

I nazwy uzytkownków takie jak nazwy katalogów. Musimy ustawić prawa Full Control na katalog dla uzytkownika.

Podejście 1 (command line):

for /D %d in (*) do cacls %d /T /E /G %d@pjwstk.edu.pl:F

Podejście 2 (Powershell):

foreach ($i in dir)
{
$acl = get-acl $i;
$ar = new-object System.Security.AccessControl.FileSystemAccessRule ($i, "FullControl", "Allow");
$acl.SetAccessRule($ar) ;
set-acl $i $acl
}

Monday, May 15, 2006 6:24:38 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

All content © 2009, Krzysztof Pietrzak
On this page
This site
Calendar
<January 2009>
SunMonTueWedThuFriSat
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567
Archives
Sitemap
Blogroll OPML
  Tokyo by night
blog WiTa
  W-Files
blog n€x¤Ra
 .:fotoblog:.
blog Kfaza
 \\archon\blog$
blog archona
 Czasowstrzymywacz
Blog Fookyego
 Jog Pstryka
Jog Pstryka
 Mac OS X vs. Active Directory
techniczny blog kfaza

Maps
Locations of visitors to this page