Windows Update install#

Ku pamięci -  na stronach MSDN, przy dokumentacji dotyczącej API do Windows Update, znajduję się skrypt który wymusza pobranie i instalacje aktualizacji z Windows Update:

 

Set updateSession = CreateObject("Microsoft.Update.Session")
Set updateSearcher = updateSession.CreateupdateSearcher()
WScript.Echo "Searching for updates..." & vbCRLF
Set searchResult = _
updateSearcher.Search("IsInstalled=0 and Type='Software'")
WScript.Echo "List of applicable items on the machine:"
For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
Next
If searchResult.Updates.Count = 0 Then
	WScript.Echo "There are no applicable updates."
	WScript.Quit
End If
WScript.Echo vbCRLF & "Creating collection of updates to download:"
Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")
For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> adding: " & update.Title 
    updatesToDownload.Add(update)
Next
WScript.Echo vbCRLF & "Downloading updates..."
Set downloader = updateSession.CreateUpdateDownloader() 
downloader.Updates = updatesToDownload
downloader.Download()
WScript.Echo  vbCRLF & "List of downloaded updates:"
For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    If update.IsDownloaded Then
       WScript.Echo I + 1 & "> " & update.Title 
    End If
Next
Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")
WScript.Echo  vbCRLF & _
"Creating collection of downloaded updates to install:" 
For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
       WScript.Echo I + 1 & "> adding:  " & update.Title 
       updatesToInstall.Add(update)	
    End If
Next
	WScript.Echo "Installing updates..."
	Set installer = updateSession.CreateUpdateInstaller()
	installer.Updates = updatesToInstall
	Set installationResult = installer.Install()
	
	'Output results of install
	WScript.Echo "Installation Result: " & _
	installationResult.ResultCode 
	WScript.Echo "Reboot Required: " & _ 
	installationResult.RebootRequired & vbCRLF 
	WScript.Echo "Listing of updates installed " & _
	 "and individual installation results:" 
	
	For I = 0 to updatesToInstall.Count - 1
		WScript.Echo I + 1 & "> " & _
		updatesToInstall.Item(i).Title & _
		": " & installationResult.GetUpdateResult(i).ResultCode 		
	Next
Wednesday, June 17, 2009 11:07:56 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Outlook Integration Error w OCS Communicator#

umocs007

Czym jest najczęściej spowodowany ten problem? Odpowiedzi na to pytanie szukałem dość długo. Co dziwne, na niektórych stacjach wydawał się nie występować. Dziwne też było zachowanie jeśli chodzi o przynależność do sieci – na stacjach domenowych, wpiętych do sieci firmowej się nie pojawiał, natomiast już przy dostępie zewnętrznym występował zawsze.

Co dziwne, standardowe usługi z których korzystał komunikator wydawały się działać, i nie zdradzać istnienia błędów.

Jak więc rozwiązać ten problem? Ja najpierw sprawdziłem gdzie usługi Exchangowe się znajdują: -

umocs001 

Następnie sprawdziłem za pomocą przeglądarki czy nie pojawia się żaden problem przy dostępie do katalogów EWS i UnifiedMessanging – w szczególności problem z dostępem do certyfikatów:

umocs003

 

umocs002

Jak widać dostęp do witryn nie wygenerował żadnych błędów.

Co więc jest przyczyną tego błędu? Jak się okazuję jest to sprawdzanie odwołania certyfikatu serwera – takie standardowe ustawienie które przychodzi wraz z IE7. Użytkownicy wewnątrz pobierają CRL z LDAP, zgodnie z wpisem w certyfikacie, natomiast zewnętrzni próbują się dostać do strony CA:

umocs004

Rozwiązanie1:Opublikować CRL na zewnątrz firmy. Dosyć trudny proces, wymagający przeważnie wykorzystania ISA i/lub skryptów w celu utworzenia zewnętrznego repozytorium certyfikatów/CRL, bez publikacji samego CA.

Rozwiązanie2: Wyłączyć opcję w IE

umocs006

 

Podobnie się zachowuję Outlook 2007. O ile Out Of Office Assistant nie korzysta z sprawdzania CRL-i, to już UnifiedMessenging jak najbardziej z tego korzysta.

Monday, March 02, 2009 8:10:31 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

ShadowCopy w Windows 2008 x64#

Ostatnio podczas przenoszenia plików użytkowników natknąłem się na typowy problem w-files.

Otóż przenieśliśmy katalogi domowe użytkowników na nowy serwer w2k8 x64. Włączyliśmy shadow copies. Zdefiniowaliśmy kopiowanie backupowe dfs-r do centrali, w celu późniejszego zrzucania stanu na tasiemki. Serwer sobie spokojnie śmigał, i wszystko wydawało się takie idealne. Nawet użytkownicy nie wydawali się niezadowolenia.

Wszystko niestety zepsuł błąd skryptu, który uszkodził strukturę katalogów na macierzy w centrali. Jako że dfs-r działa prawie niezawodnie, szybko dało się odczuć braki katalogów w oddziale.

Ale przecież jest shadow copy, więc nie powinno być problemu. Tak więc postanowiliśmy wejść do shadow copy, i spróbować przywrócić foldery.

I tu pojawił się pierwszy problem - shadow copy udawał, że nie umie znaleźć plików w folderach - wyświetlał się komunikat o ścieżce nie do znalezienia. Hmmm... problem uprawnień. Wobec tego przelogowujemy się i próbujemy jeszcze raz.. znowu nic.

Niestety w oddziale nie było żadnego innego serwera, a tylko stacje klienckie z xp. Wobec tego logujemy się zdalnie na stacje,i próbujemy odzyskać pliki. Jest, udaje się, ale niestety uprawnienia do plików się nie przenoszą.

Próbujemy volrest z w2k3 resource tools, niestety bez skutecznie. Narzędzie nie może sie podpiąć do shadow copy z windows 2008 w2k8 x64.

... chwilka załamania i wizja ręcznego ustawiania uprawnień.... nagle pomysł.., przecież shadow copy sharuje folder udostępniony z tą samą nazwą tylko z przedrostkiem określającym datę... wobec tego wejdźmy do właściwości otworzonej kopi shadow copy i znajdźmy ścieżkę... o, jest.

To teraz tylko robocopy w trybie backup – robocopy /b /COPY:DATSO /s /e /r:1 /w:1 i juz. Tylko kilka godzi stresu dla administratorów, i tylko godzina szukania narzędzia do przeglądania shadow copy : )

Tuesday, September 02, 2008 11:30:23 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Autoryzacja użytkownika w C##

Czasami potrzebujemy fragmentu kodu, który umożliwi autoryzację użytkownika, który ma zablokowane konto - np. wtedy, kiedy loguje się do portalu typu self-service i chciałby sprawdzić, dlaczego ma zablokowane konto.

Przy próbie bindowania do AD extended error widzi rozróżnienie między kontem z zalokowanym, zablokowanym i złym hasłem. Niestety, tego błędu nie zobaczymy, jeśli użyjemy klas DirectoryServices czy ADSI - oba te interfejsy próbują się bindować dopiero przy podłączeniu do określonego obiektu i wyrzucają błąd PermissionDenied. Można oczywiście użyć klas novella do obslugi AD, ale niestety pod Windowsem nie wspierają TLS-a przy dostepie do LDAP-a.
Można tez użyc interopa i dllki advapi32.dll, co jest pokazane poniżej:

using System.Runtime.InteropServices;
(..)// w klasie
[DllImport("advapi32.dll", CharSet = CharSet.Auto,SetLastError=true)]
public static extern bool LogonUser(String lpszUserName,
String lpszDomain,
String lpszPassword,
int dwLogonType,
int dwLogonProvider,
ref IntPtr phToken);

public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_PROVIDER_DEFAULT = 0;
public const int LOGON32_LOGON_NETWORK = 3;
(..) // i w kodzie
IntPtr token = IntPtr.Zero;
bool res = LogonUser(
textBoxUserName.Text,
textBoxDomainName.Text,
textBoxPassword.Text,
LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,
ref token);
label1.Text= Marshal.GetLastWin32Error().ToString()+" : "+res.ToString();

Marshal.GetLastWin32Error() powinien nam zwrócić różne kody błędu przy różnych próbach dostępu do AD.

Tuesday, May 15, 2007 4:14:33 PM (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

 

Logowanie do AD z Grupami#

Po małym przeszukaniu internetu (głównieCodeProject i ExpertExchange) udało mi się w końcu zrobić logowanie do AD z wykorzystaniem grup (ale tylko tych jawnie wpisanych użytkowników, bez rozwijania grup zagnieżdżonych).

Główny kod programu:

//try autchenitcation
string[] groupsToCheck ={ "cwiczeniowcy", "Asystenci", "operatorzy", "wykladowcy" };

try
{
 //bind to ad
 DirectoryEntry de = new DirectoryEntry("LDAP://dc=pjwstk,dc=edu,dc=pl", TBLogin.Text,  TBHaslo.Text);
 DirectorySearcher mySearcher = new DirectorySearcher(de);
 mySearcher.Filter = ("(&(ObjectCategory=Person)(ObjectClass=user)(SAMAccountName=" + TBLogin.Text  + "))");
 mySearcher.PropertiesToLoad.Add("givenName");
 mySearcher.PropertiesToLoad.Add("sn");
 mySearcher.PropertiesToLoad.Add("Path");
 mySearcher.PropertiesToLoad.Add("primaryGroupId");
 mySearcher.PropertiesToLoad.Add("objectSid");
 SearchResult results = mySearcher.FindOne();
 if (null != results)
 {
  uImie = results.Properties["givenName"][0].ToString();
  uNazwisko = results.Properties["sn"][0].ToString();
  //get user groups
  ArrayList groups = new ArrayList();
  DirectoryEntry obUser = new DirectoryEntry(results.Path);
  object obGroups = obUser.Invoke("Groups");
  foreach (object ob in (IEnumerable)obGroups)
   {
    DirectoryEntry obGpEntry = new DirectoryEntry(ob);
    groups.Add(obGpEntry.Name);
   }
  //get primary group
  int primaryGroupId = (int)results.Properties["PrimaryGroupID"][0];
  byte[] userSid = results.Properties["objectSid"][0] as byte[];
  byte[] primaryGroupSid = BuildPrimaryGroupSID(userSid, primaryGroupId);
  string adsPath = String.Format("LDAP://<SID={0}>", BuildOctetString(primaryGroupSid));
  DirectoryEntry objUser = new DirectoryEntry(adsPath, TBLogin.Text, TBHaslo.Text);
  groups.Add((string)objUser.Properties["name"].Value);
  //check if member is in group
  bool isInGroup =false;
  foreach (string stc in groupsToCheck)
   if (groups.Contains(stc)) isInGroup = true;
  if (isInGroup)
   {
    //Authenticated
   }
  else
  {
   LblError.Text = "Nie masz uprawnien do wypelnienienia ankiety";
  }
 }
  else LblError.Text += "Blad Autoryzacji";
 }
catch (Exception dsce)
{
 LblError.Text = "Blad Autoryzacji";
}
// insertXML(uImie,uNazwisko);

Do tego potrzebujemy jeszcze funkcję do konwersji SIDów

private byte[] BuildPrimaryGroupSID(byte[] userSid, int primaryGroupId)
{
 byte[] rid = BitConverter.GetBytes(primaryGroupId);
 for (int i = 0; i < rid.Length; i++)
 {
  userSid.SetValue(rid[i], new long[] { userSid.Length - (rid.Length - i) });
 }
 return userSid;
}

private string BuildOctetString(byte[] bytes)
{
 StringBuilder sb = new StringBuilder();
 for (int i = 0; i < bytes.Length; i++)
 {
  sb.AppendFormat("{0}", bytes[i].ToString("X2"));
 }
 return sb.ToString();
}

I klasę, która produkuje SID

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Runtime.InteropServices;
using PSID = System.IntPtr;
using HLOCAL = System.IntPtr;
using BOOL = System.Int32;
using HANDLE = System.IntPtr;
using DWORD = System.UInt32;

/// <summary>
/// Summary description for Class1
/// </summary>
public class sid
{
 [DllImport("Advapi32.dll", CallingConvention = CallingConvention.Winapi, SetLastError = true,  CharSet = CharSet.Auto)]
 public static extern BOOL ConvertSidToStringSid(PSID Sid, out IntPtr StringSid);

 public unsafe static string UnsafeGetSidString(object sid)
 {
 string sidString = null;
 IntPtr strPtr;
 fixed (byte* psid = (byte[])sid)
  {
   IntPtr psidPtr = (IntPtr)psid;
   BOOL rc = ConvertSidToStringSid(psidPtr, out strPtr);
   Win32.CheckCall(rc);
   try
   {
    sidString = Marshal.PtrToStringAuto(strPtr);
   }
   finally
   {
    Win32.LocalFree(strPtr);
   }
  }
  return sidString;
 }
}
public class Win32
{
 [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 public static extern HLOCAL LocalFree(HLOCAL hMem);
 public static void CheckCall(bool funcResult)
 {
  if (!funcResult)
  {
   ThrowLastError();
  }
  }
 public static void CheckCall(BOOL funcResult)
 {
  CheckCall(funcResult != 0);
 }
 public static void CheckCall(HANDLE funcResult)
 {
  CheckCall(!IsNullHandle(funcResult));
 }
 public static DWORD GetLastError()
 {
  return (DWORD)Marshal.GetLastWin32Error();
 }
 public static bool IsNullHandle(HANDLE ptr)
 {
  return (ptr == IntPtr.Zero);
 }
 public static void ThrowLastError()
 {
  Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
 }
}

 

Oczywiście w web.config w <system.web> musimy dodać obsługę funkcji typu unsafe:

        <compilation>
            <assemblies>
             <add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
            </assemblies>
            <compilers>
                <compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/unsafe" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
            </compilers>
        </compilation>

Tuesday, October 17, 2006 9:33:34 AM (Central European Standard Time, UTC+01:00) #    Comments [2]  |  Trackback

 

Jabber COM component#
 Ostatnio brakowało mi trochę komponentu do skryptu, który umożliwiałby wysyłanie powiadomień na jabbera.
    Na JabberStudio powstał projekt jabber-net zawierający biblioteki do C#, które umożliwiają napisanie własnego klienta jabbera. Stąd był już tylko krok do opakowania ich w interfejsy COM-owe, co umożliwiło ich wykorzystanie w skryptach.

 Biblioteczka dostępna tutaj.
Wednesday, July 19, 2006 1:16:42 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Windows Server 2003 Service Pack 2#

Na connect.microsoft.com pojawiła się wersja pre-beta SP2 do w2k3. Warto się bliżej zapoznać z dwu powodów.

 Po pierwsze dochodzi znane z R2 MMC 3.0 - czasami snapiny nie działają, więc warto przetestować wcześniej.

  Po drugie i najważniejsze - dochodzi WDS, czyli następca RIS-a. A ja się zastanawiałem, co będę robić podczas wakacji...

RIS | Windows
Sunday, June 25, 2006 10:02:56 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

TDSSNIClient initialization failed with error 0x34 , status code 0x1d#

SQL Server 2005 po ostatnim biuletynie zabezpieczeń się zepsuł - tzn. nie wstawał. W logach był błąd taki jak w TOpicu. Po przejrzeniu paru blogów o podobnych błędach, np http://blogs.msdn.com/sql_protocols/archive/2006/01/10/511330.aspx , czy http://blogs.msdn.com/sql_protocols/archive/2006/04/28/585835.aspx?Ajax_CallBack=true mogłem dojść do przekonania, ze błędem jest zduplikowany adres IP.

Ale co zrobić jeśli nie jest? I do tego serwer nasłuchuję tylko na jednym adresie?. Metodą prób-i-błędów doszedłem do tego ze muszę włączyć nasłuchiwanie na wszystkich adresach - wtedy serwer się podnosi, ale komunikacji z zdalnego komputera dalej się nie da uzyskać.

Zeby wszystko zaczeło działać, musiałem jawnie określić port w sekcji IPALL dla wszystkich IPków.

Sunday, June 18, 2006 9:52:09 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

ISA2006#
    Pojawiła się już RC ISA2006 - do zessania ze stron Microsoftu.

Poza poprawieniem troszeczkę interfejsu, dodaniu paru kreatorów, nic się nie zmieniło. A co najważniejsze, mimo zapowiedzi na MTS, czy na SecuritySUmmit, nie wprowadzono obsługi IPv6. Przecież po to Microsoft wprowadzał ISA2006 (a  nie kolejnego SP), żeby współpracowała dobrze z Vistą i Longhornem. A podstawowym załeżeniem sieci w Viscie i Longhornie, jest umożliwienie działania każdej usługi na IPv6.
Według mnie, Microsoft nie uważa żeby wykorzytsanie IPv6 było popularne przed pojawieniem się Longhorn serwera (palnowane na jesień 07), i prawdopodobnie dopiero w ISA2007(prawdopodobnie listopad 07) pojawi się ipv6.

IPv6 w ISA wg. mnie umożliwiło by szybsze przejście użytkowników na ten protokół, w szczególności, dzięki funkcją publikacji serwerów, nie musielibyśmy wystawiać serwerów po IPv6 na zewnątrz. Wystarczyło by odpowiednio skonfigurować isę.

Wednesday, June 14, 2006 4:27:52 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Najfajniejsze pytanie w Helpie Longhorn servera Beta 2#

Can I still use IPv4 addresses with this version of Windows?

Yes, you can.

To w skrócie podsumowuję zmiany w Longhorn Serwerze. W końcuy została dodana pelna obsługa protokołu IPv6 (tzn. AD i RPC po IPv6, praca w domenie tylko po IPv6 [na razie testowałem tylko z visą], pełny Firewall i IPSEC z obsługą IPv6 i konfigurowaniem graficznym przez GPO[w odroznieniu od XP, gdzie IPv6FW był, ale jego konfiguracja była strasznie trudna], DNS z obsługą REV IPv6 i automatycznym tworzeniem pointerów[jak w IPv4], DHCPv6.

Saturday, June 10, 2006 7:53:24 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Migracja do R2#

R2 ujrzało juz światło dzienne - wiec pora na migrację. Zgodnie z podręcznikami, abyśmy mogli korzystać z bardziej zaawansowanych opcji typu zarządzanie drukarkami, czy nowym frs'em, musimy zupdatować schema. W większości przypadków wystarczy po prostu uruchomić adprep /forestprep z drugiego CD. Jednak jeśli wcześniej mieliśmy zainstalowany SFU < 3.0, pojawiaja się problemy.

Problemy wynikaja głównie z tego, ze wersje < 3.0 uzywały schematu kompatybilnego z possixem, a schemat z 3.0 i wyzszych uzywa atrybutów i klas z przedrostkiem msf30. Wynikało to z tego ze w czasach gdy wchodziło 3.0 królującym OSem był W2k serwer, który uniemozliwiał zmienianie nazw czy ustawianie flagi defunct na atrybutach. Schematy te się rózniły i to w dość znacznym stopniu, więc aby uniknąć problemów z migracją Microsoft wprowadził nowy schemat nazewniczy.

W Services for Unix mamy powrót znowu do schematu possixowego - takiego jak w SFU 2.0. Czyli przy migracji dostaniemy błędy mówiące ze dane atrybuty juz istnieją. Ni9estety nie ukazał się jeszcze zadny kb opisujący co zrobić.

Metoda jest bardzo prosta. Po pierwsze sprawdzamy czy gdziekolwiek jeszcze uzywamy atrybutów z SFU 2.0 . jeśli nie, a w większości przypadków nie będziemy uzywali, jako ze zrobiliśmy migrację do 3.0, mozemy przejść dalej. Jeśli jednak uzywamy atrybutów z 2.0 musimy zrobić pelen ich backup.

Drugim krokiem jest, korzystając z Active directory Schema ,przestawienie wszystkich spornych atrybutów i klas w tryb defunct - oczywiście do tego potrzebujemy zeby domena i las były w trybie windows 2003 native. Większość atrybutów jest powiązana z klasami, w tym przypadku musimy usunąć wszystkie zalezności z klas.

Kolejnym krokiem jest zmiana nazwy atrybutów które przestawiliśmy w tryb defunct. Niestety ta wersja adprepa nie ma mozliwości wykorzytsania starych atrybutów.

I ostatni krok - adprep /forestprep - i powinno wszystko działać.

Saturday, April 29, 2006 12:48:54 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

VS2k5 Unattended#
W sumie instalacja nienadzorowana jest całkiem dobrze opisana. A więc mamy dwa tryby takiej instalacji:

a) Response File

Odpalamy setup za pomocą Setup/setup.exe /CreateUnattend="c:\unattned.inf" I torzymy plik z odpowiedzią. Cały proces jest prosty i przyjemny, posiada tylko pare drobnych wad.
Po pierwsze, instaluję całe VS łącznie ze wszystkimi wymaganymi bibliotekami, nawet jeśli biblioteki są juz zainstalowane. Co w przypadku .Net Frameworka zabiera juz ok.10min, a cały proces instalacji wydluza o ok.20.
Po drugie, nie nadaję się do upgradów. Przy zainstalowanym wcześniej VS np. przez instalacje SQL Servera 2k5, instalator stwierdzi ze VS jest juz zainstalowane i pominie ten krok.

b) Transform

Odpalamy setup za pomocą Setup/setup.exe /CreateUnattend="c:\unattned.inf" . I tu wielka, gigantyczna uwaga: pliki setupu(a dokładniej .msi) nie mogą być read-only!! Trzeba usunąć atrybut tylko-do-odczytu, bo inaczej instalacja zawodzi.
Jak na razie nie testowałem jeszcze instalacji z wykorzystaniem transform, gdyz nie wiedziałem o powyrzszej uwadzę.

Oczywiście przy instalacji z transform musimy wcześniej doinstalować komponenty tj. MSXML, Dexplore, czy .Net framewok. Microsoft radzi uzywać instalek znajdujących się w katalogu wcu. W większości są to spakowane archiwa, które przy instalacji rozpakowują się na dysk lokalny i dopiero z niego są instalowane. Przy szybkiej sieci, gdy nie zalezy nam na wydajności łącza, mozemy je rozpakować i odpalić tylko same instalki. W normalnych warunkach zaoszczędza nam to ok. 10min.
Przykładowy plik cmd do instalki z rozpakowanych archiwów:

WindowsInstaller-KB893803-v2-x86.exe /passive /norestart

msxml6.msi /qr REBOOT=RS

dotnetfx\install.exe /qb

DExplore\install.exe /qb

jsredist\install.exe /qb

Thursday, March 02, 2006 11:00:27 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Autologon i RunOnceEx#

Skrypty które automatycznie logują się na dany komputer i odpalają dany program moga stworzyć prosty system instalacji oprogramowania. Taki przykładowy skrypt to:

@ECHO OFF

REM Setting Autologon

REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultDomainName" /t REG_SZ /d "PJWSTK" /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultUserName" /t REG_SZ /d "Admin_Name" /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DefaultPassword" /t REG_SZ /d "Admin_Password" /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoAdminLogon" /t REG_SZ /d 1 /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AutoLogonCount" /t REG_SZ /d 1 /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "ForceAutoLogon" /t REG_SZ /d 1 /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "CachePrimaryDomain" /t REG_SZ /d "PJWSTK" /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AltDefaultUserName" /t REG_SZ /d "pkrzysz" /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "AltDefaultDomainName" /t REG_SZ /d "PJWSTK" /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v "DontDisplayLastUserName" /t REG_SZ /d "0" /f
REG ADD "\\%1\HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\DomainCache" /v "PJWSTK" /t REG_SZ /d "pjwstk.edu.pl" /f

REM Setting Autostart

REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx" /t REG_SZ /v Title /d "Installing Additional Software" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx" /t REG_DWORD /v Flags /d 306 /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install01" /t REG_SZ /v "" /d "Preparing install" /f
rem REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install01" /t REG_SZ /v 1 /d "rundll32.exe user32.dll, LockWorkStation " /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install01" /t REG_SZ /v 2 /d "fsutil quota modify c: 80000000000 80000000000 PJWSTK\pkrzysz" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install01" /t REG_SZ /v 3 /d "fsutil quota modify c: 80000000000 80000000000 PJWSTK\risasi" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install01" /t REG_SZ /v 4 /d "fsutil quota disable d:" /f

REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install02" /t REG_SZ /v "" /d "Installing..." /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install02" /t REG_SZ /v 1 /d "echo ." /f

REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v "" /d "Cleaning Registry..." /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 1 /d "reg.exe add """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon""" /v """DefaultDomainName""" /t REG_SZ /d """PJWSTK""" /f" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 2 /d "reg.exe add """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon""" /v """AutoAdminLogon""" /t REG_SZ /d """0""" /f" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 3 /d "reg.exe add """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon""" /v """AutoLogonCount""" /t REG_SZ /d """0""" /f" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 4 /d "REG.exe DELETE """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon""" /v """DefaultUserName""" /f" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 5 /d "REG.exe DELETE """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon""" /v """DefaultPassword""" /f" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 6 /d "REG.exe DELETE """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon""" /v """ForceAutoLogon""" /f" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 7 /d "rEG.exe DELETE """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon""" /v """DontDisplayLastUserName""" /f" /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install03" /t REG_SZ /v 8 /d "REG.exe DELETE """HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run""" /v """afterreboot""" /f" /f

REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install04" /t REG_SZ /v "" /d "Rebooting..." /f
REG ADD "\\%1\HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\install04" /t REG_SZ /v 1 /d "shutdown -r -t 0 -f" /f


shutdown -r -f -t 0 -m \\%1

Wednesday, March 01, 2006 1:53:18 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Problem z instalacjami - rozwiązany#
 Był sobie taki problem:

Przy instalacji dowolnego programu korzystającego z MSI, przy etapie kopiowania plików, podczas kopiowania dll wyskakiwał błąd. W zaleznosci od interpretacji mówił on albo o braku miejsca na dysku, albo o braku uprawnień, albo po prostu o niemozliwosci zapisania pliku na dysk.

Problem był sam w sobie dziwny, poniewaz miejsce na dysku było, oraz uprawnienia były odpowiednie. Instalator otwierał plik, czyścił go, zapisywał, i koniec - plik miał 0 bajtów i wyświetlał się błąd.Po cofnięciu instalacji pliki były przywracane.

Oczywiście zabrałem się do problemu wyposazony w combo Regwatch,filewatch z sysinternals. Skanowanie rejestru nic nie dało, natomiast podczas skanowania plików okazało się ze zawodzi operacja SET SECURITY.

Zastanawiałem się więc czemu jako administrator systemu, a nawet jako uzytkownik Local System nie mogę zainstalować najprostszych programów. W ruch poszedł google, Platform SDK, kbAlertz!, msfn i wiele innych. I nic. Robocza hipoteza nr.1 -> system mi nie daję tokenu który umozliwia zmianę uprawnień dla danego pliku.

Szybko zobaczyłem Security, oraz ownera pliku. Zgodnie z moimi przypuszczeniami, właścicielem okazał się uzytkownik risasi.
Kto to jest risasi? Mój uzytkownik domenowy do instalacji unattended z RIS-a (RIS  Automated System Installer). Na początku jest on przyłączany do grupy Adminisratorów lokalnych, następnie są zdejmowane dla niego quoty. Po skończonej instalacji jest usuwany z Administratorów lokalnych, i quota jest przywrócona.

Jako ze właścicilem pliku jest risasi, to moze trzeba go dodać do administratorów zeby działało? Niestety nie.
To moźe po zmianie właściciela pliku będzie działało? Działało:)

Robocza hipoteza nr.2 -> Wyrzucenie uzytkownika z grupy Administratorów lokalnych bez zmiany właściciela dll które zainstalował nie jest dobrym pomysłem.

Po miesiącu powróciłem do tematu. Przeszłem jeszcze raz przez Filemona, regmona, logi z instalacji. Moją uwagę zwróciła wiadomosć rozszerzona przy polu SET SECCURITY -> disk full.
Okazało sie, ze uzytkownik risasi ma grubo przekroczoną quotę na dysku. Co ma quota do właściciela pliku?

Okazało sie ze msiexec tylko dla dll po nadpisaniu pliku zmienia ownera na ownera który był przed instalacją.

Niby mały błąd, a jednak moze duzo zepsuć. Ja nie mogłem np. instalować nowszych wersji programów, zarówno ręcznie jak i poprzez GPO.

Błąd ten moze być tez wykorzystany przez uzytkowników do ataku na miejsce na dysku komputera, gdyz quoty dla tych dll są naliczane dla ownera.

Wednesday, February 22, 2006 10:56:59 PM (Central European Standard Time, UTC+01:00) #    Comments [1]  |  Trackback

 

Microsoft AntiVirus#
 W końcu Microsoft zamierza wypuścić antyviruas. Oczywiscie nie dla użytkowników końcowych, dla których jest OneCare( antyvirus,antysoywar,firewall), a dla klientów korporacyjnych - i targetowany zarówno dla stacji klienckich i serwerów, jak i jako serwer filtrujący

http://www.microsoft.com/windowsserversystem/solutions/security/clientprotection/default.mspx

Nie pozostaje zatem nic innego jak poczekać do magicznego Q4 2006 jak będzie dostępny na MSDNie

Friday, February 10, 2006 1:27:40 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

VMvare Server za Free#

VMWare wypuścił serwer za free dla Windowsów i Li nuksów!
Jest to prawdopodobnie odpowiedź na Microsoftowy Virtual Server R2, który kosztuję 99$; czy darmową Linuxową platformę wirtualizcyjną XEN.
Oczywiście produkt ten plaasuję się w podobnie jak VSR2 w kategori GSX, czyli systemu serverowemu instalujacemu się na bazie istniejącego systemu; a nie tak jak w ESX czy XENie jako dedykowany server.
Poniżej link a mnie pozostaje czekać aż XEN dogoni ESX z VirtualCenter pod względem funkcjonalności
http://www.vmware.com/products/server/

Tuesday, February 07, 2006 10:08:24 PM (Central European Standard Time, UTC+01:00) #    Comments [2]  |  Trackback

 

Opera 9.0 TP2#

Po przetestowaniu IE 7.0 beta 2 byłem pełen nadzieji w stosunku do Opery. Może w końcu będzie działała autentykacja NTLMowa oraz AJAX? Niestety, specjaliści od opery skupili się na gadżetach, a nie na pisaniu porządnego kodu (zgodnie z powiedzeniem Billa zprzed 10 lat- jeśli nie mozesz czegoś zrobić dobrze, zrób zeby to ładnie wyglądało).


I tak dla NTLMa jest dodany experymentalny support, który jednak nie działa dla żednego site'a którego testowałem, a AJAXa po prostu nie ma! Jak można przegapić najciekawszą techologię Webową od czasu flasha!? Przecież wszyscy nad tym aktywnie pracują - czy to ruch Open Source z AJAXem, czy to Microsoft z ATLASem i XMLHTML. Jak tak dalej pójdzie to Opera stanie się tak niszową przeglądarką jak Netscape.


Co więc się zmieniło? Poza wsparciem dla CSS 3.0 i poprawieniem parsowania HTMLa programiści opery skupili się głównie na takich rzeczach jak obsługa torrentów,wbudowany edytor wyszukiwarek,nowe strony about:xxx i tym podobne szczególiki. Czym więc ta wersja Opery zasłużyła sobie na nowy numerek edycji? Według mnie obsługą widgetsów - czyli małych pluginów mogących wyświetlać dodatkowe okienka tj. zegarek czy stan konta pocztowego. Ciekawe jak długo minie aż w operze będą się automatcznie wyświetlały reklamy, czy powstawały strony z reklamami popupwidget.

Tuesday, February 07, 2006 10:02:57 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Wysylanie meijli ze skryptow, czyli CDO.Message#

Najprostszy skrypt do wysyłania meili w vbsie wyglada następująco:

Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Example CDO Message"
objMessage.From = "me@my.com"
objMessage.To = "test@paulsadowski.com"
objMessage.TextBody = "This is some sample message text."
objMessage.Send

Oczywiście mozemy dodadć załącznik, czy wysłać wiadomość w htmlu

'The line below shows how to send using HTML included directly in your script
objMessage.HTMLBody = "<h1>This is some sample message html.</h1>"

'The line below shows how to send a webpage from a remote site
objMessage.CreateMHTMLBody "http://www.paulsadowski.com/wsh/"

'The line below shows how to send a webpage from a file on your machine
objMessage.CreateMHTMLBody "file://c|/temp/test.htm"

objMessage.Bcc = "you@your.com"
objMessage.Cc = you2@your.com


Bardziej rozbudowana postać do wysyłania przez serwer z autentykacją ntlm:

Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory.
Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network).

Const cdoAnonymous = 0 'Do not authenticate
Const cdoBasic = 1 'basic (clear-text) authentication
Const cdoNTLM = 2 'NTLM

Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Temat"
objMessage.From = """nadawca"" nadawca@domena.com"
objMessage.To = "odbiorca1@domena1.com"
objMessage.TextBody = "Serwer "

'==This section provides the configuration information for the remote SMTP server.

objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtpServer"

'Type of authentication, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoNTLM

'Server port (typically 25)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

'Use SSL for the connection (False or True)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False

'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
objMessage.Configuration.Fields.Update

'==End remote SMTP server configuration section==
objMessage.Send

I na koniec wersja z nazwa uzytkownika i hasłem, oraz włączonym tlsem:

Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory.
Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network).

Const cdoAnonymous = 0 'Do not authenticate
Const cdoBasic = 1 'basic (clear-text) authentication
Const cdoNTLM = 2 'NTLM

Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Example CDO Message"
objMessage.From = """Me"" <me@my.com>"
objMessage.To = "test@paulsadowski.com"
objMessage.TextBody = "This is some sample message text.." & vbCRLF & "It was sent using SMTP authentication."

'==This section provides the configuration information for the remote SMTP server.

objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.your.com"

'Type of authentication, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic

'Your UserID on the SMTP server
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "youruserid"

'Your password on the SMTP server
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "yourpassword"

'Server port (typically 25)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

'Use SSL for the connection (False or True)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = TRUE

'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60

objMessage.Configuration.Fields.Update

'==End remote SMTP server configuration section==
objMessage.Send

 

 

Thursday, February 02, 2006 11:31:04 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

SAN tanim kosztem#

Jak zawsze Linux wypuścił się do przodu, iu teraz za pomocą http://iscsitarget.sourceforge.net/ moze emulować SAN po iSCSI. Co to daje windowsom? To ze korzystając z Inicjatora microsoftu http://www.microsoft.com/downloads/details.aspx?FamilyID=12cb3c1a-15d6-4585-b385-befd1319f825&DisplayLang=en mozna podpiąć dysk stworzony na linuksie do serwera. Taki dysk będzie widoczny w windowsach jako typowy dysk SCSI, ktory mozna podzielić na partycję, sformatować, i zrobić wszystko co się chcę.

 Po stronie Linuxemy jako iSCSI wyeksportować dowolnę urządzenie - np. macierz RAID5, lub LVM.Co zapewnia nam wszystie mozliwośći typowych SANów - min. snapshoty.

Jeśliu chodzi o wydajność to iSCSI kładzie na łopatki typowe rozwiązania typu NAS(tj. eksportujące po CIFS lub NFS), szczególnie w przypadku małych plików(programy pocztowe), czy dostępu niesekwencyjnego(jak w bazach danych). Artykuł o wydajności: http://www.technomagesinc.com/papers/ip_paper.html

Jedyną wadą iSCSI, a dokładniej systemów plików, jest brak mechanizu blokad, co kieruję to rozwiązanie raczej dla serwerów, a nie dla zwykłych uzytkowników.

Thursday, December 29, 2005 4:08:18 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

ABE#

Access Based Enumeration - czyli wyświetlanie tylko tych sharów, do których uzytkownik ma dostęp. Funkcjonalność ta poidobnie jak SSAPI jest wbudowana w windowsy 2003, ale brakuję do niej standardowo interfejsu. Na szczęście Microsoft naprawił ten błąd :  http://www.microsoft.com/downloads/details.aspx?FamilyId=04A563D9-78D9-4342-A485-B030AC442084&displaylang=en

Thursday, December 29, 2005 3:54:09 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

SFU cd#

Jak zawsze zapomnialem ze pole memberOf nie uwzględnia primary group. Ponizej znajduję się poprawiony skrypt:

 

ON ERROR RESUME NEXT
Const ADS_PROPERTY_APPEND = 3
Const ADS_PROPERTY_CLEAR = 1
i=0
Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open ""
If adoConnection.State <> 1 Then
Wscript.echo "Creating ADO connection: Authentication Failed."
else
Wscript.echo "connection opened: "&adoConnection.state&vbCrLf
End If

'prepare command to execute
Set adoCmd = CreateObject("ADODB.Command")
Set adoCmd.ActiveConnection = adoConnection
adoCmd.Properties("Page Size") = 4000
adoCmd.CommandText = "<LDAP://DC=pjwstk,DC=edu,DC=pl>;(ObjectCategory=Group);ADsPath,msSFU30Name;SubTree"
'execute query
Set adoRecordset = adoCmd.Execute


Wscript.echo adoRecordset.RecordCount & " records found."
Wscript.echo "debug err status: "&err.number

'clear all groups from users

While Not adoRecordset.EOF
        If not isNull(adoRecordset.Fields("msSFU30Name").Value) then
         Wscript.echo adoRecordset.Fields("ADsPath").Value
         Set objGroupPosix = GetObject (adoRecordset.Fields("ADsPath").Value)
     objGroupPosix.GetInfo
     objGroupPosix.PutEx ADS_PROPERTY_CLEAR, "msSFU30PosixMember", 0
objGroupPosix.SetInfo
        end if
adoRecordset.MoveNext
Wend

adoCmd.CommandText = "<LDAP://DC=pjwstk,DC=edu,DC=pl>;(ObjectCategory=User);distinguishedName,msSFU30NISDomain,Name;SubTree"
'execute query
Set adoRecordset = adoCmd.Execute
Wscript.echo adoRecordset.RecordCount & " records found."
Wscript.echo "debug err status: "&err.number
i=0
While Not adoRecordset.EOF
if not isNull( adoRecordset.Fields("msSFU30NISDomain").Value ) then
strUserNTName=adoRecordset.Fields("Name").Value
strUserNTDN=adoRecordset.Fields("distinguishedName").Value
valid=1
wscript.echo strUserNTName&" "&i

'loop throught user by strUserNTName
Dim objUserWinNT, intGroupID, strFilter, strAttributes, objRootDSE
Dim strDNSDomain, objConnection, objCommand, strQuery, objRecordSet
Dim intGroupToken, strGroupName, strUserNTName, objGroup

' Bind to the user object with the WinNT provider.

Set objUserWinNT = GetObject("WinNT://PJWSTK/" & strUserNTName & ",user")
If Err.Number <> 0 Then
valid=0
Err.Number=0
End If
if (valid=1) then
' Search for groups the user is a member of.
strFilter = "(|"
For Each objGroup in objUserWinNT.Groups
strFilter = strFilter & "(sAMAccountName=" & objGroup.name & ")"
Next
strFilter = strFilter & ")"
strAttributes = "sAMAccountName,distinguishedName,msSFU30PosixMember"

' Determine DNS domain name from the RootDSE object.
Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("defaultNamingContext")

' Use ADO to search Active Directory for the groups.
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection

strQuery = "<LDAP://" & strDNSDomain & ">;" & strFilter & ";" & strAttributes & ";subtree"
objCommand.CommandText = strQuery
objCommand.Properties("Page Size") = 100
objCommand.Properties("Timeout") = 30
objCommand.Properties("Cache Results") = False

Set objRecordSet = objCommand.Execute
If objRecordSet.EOF Then
Wscript.Echo "No Primary Group found"
objConnection.Close
Set objUserWinNT = Nothing
Set objRootDSE = Nothing
Set objConnection = Nothing
Set objCommand = Nothing
Set objRecordSet = Nothing
End If

' Enumerate the groups the user is a member of
Do Until objRecordSet.EOF
Set objGroupPosix = GetObject("LDAP://"&objRecordSet.Fields("distinguishedName"))
     objGroupPosix.GetInfo
     if (objGroupPosix.msSFU30Name<>"") then
objGroupPosix.PutEx ADS_PROPERTY_APPEND, "msSFU30PosixMember",Array(strUserNTDN)
objGroupPosix.SetInfo
end if
objRecordSet.MoveNext
Loop

' Clean up.
objConnection.Close
Set objUserWinNT = Nothing
Set objRootDSE = Nothing
Set objConnection = Nothing
Set objCommand = Nothing
Set objRecordSet = Nothing
i = i+1
end if
end if
adoRecordset.MoveNext
Wend
Wscript.echo i

Friday, December 09, 2005 8:53:28 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

SFU adding Group Membership Info#

 Aby dobrze mapowały się podgrupy w *IXach,trzeba dodać uzytkowników do odpowiednich grup NISowych. W tym celu nalezy dla kazdej grupy ktora powinna być mapowana dodać odpowiedni GUID , na zakładce UNIX ATTRIBUTES w Active Directory,a następnie odpalić ponizszy skrypt który zmapuje uzytkowników:


Const ADS_PROPERTY_APPEND = 3
Const ADS_PROPERTY_CLEAR = 1

Set adoConnection = CreateObject("ADODB.Connection")
adoConnection.Provider = "ADsDSOObject"
adoConnection.Open ""
If adoConnection.State <> 1 Then
Wscript.echo "Creating ADO connection: Authentication Failed."
else
Wscript.echo "connection opened: "&adoConnection.state&vbCrLf
End If

'prepare command to execute
Set adoCmd = CreateObject("ADODB.Command")
Set adoCmd.ActiveConnection = adoConnection
adoCmd.Properties("Page Size") = 4000
adoCmd.CommandText = "<LDAP://DC=pjwstk,DC=edu,DC=pl>;(ObjectCategory=Group);ADsPath,Name;SubTree"
'execute query
Set adoRecordset = adoCmd.Execute


Wscript.echo adoRecordset.RecordCount & " records found."
Wscript.echo "debug err status: "&err.number



While Not adoRecordset.EOF
Set objGroupPosix = GetObject (adoRecordset.Fields("ADsPath").Value)
     objGroupPosix.GetInfo
     objGroupPosix.PutEx ADS_PROPERTY_CLEAR, "msSFU30PosixMember", 0
objGroupPosix.SetInfo
arrMember = objGroupPosix.GetEx("Member")
objGroupPosix.PutEx ADS_PROPERTY_APPEND, "msSFU30PosixMember", arrMember
objGroupPosix.SetInfo
    Wscript.Echo adoRecordset.Fields("Name").Value
adoRecordset.MoveNext
Wend

Friday, December 09, 2005 1:57:23 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

JCREATOR LE#

   Jcreator LE nie działał w jednej sali. Oczywiście okazaqło się ze jest to sala 130, którą jak dotąd omijaliśmy szerokim łukiem jeśli chodzi o instalki, z tego powodu ze są tam zainstalowane wszystkie mozliwe programy do obróbki dźwięku i obrazu.

   Jcreator oczywiście odpala się, ale przypróbie skompilowania plików zawiesza się, a przy próbie odpalenia wyrzuca błąd i prosi okontakt z administratorem.

Szybka praca z filemonem i regmonem ujawiła ze winnym jest plik GE2001.exe, a problemem jest ustawienie permission na klucz HKLM\Software\Licences.

Co najgorsze , aplikacja wymaga uprawnień Create Subkey|Set Value|Delete. Na szczęscie rzadna inna aplikacja nie wykorzystuję tych kluczy.

Odpowiednie wpisy w rejestrze mozemy zmodifikować za pomocą subinacl z Reskita:

 

subinacl /subkeyreg \\Lab130-11\HKEY_LOCAL_MACHINE\Software\Licenses /grant="PJWSTK\Domain Users"=F /noverbose /display

Wednesday, December 07, 2005 7:57:33 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Monitorowanie stanu hostów#

   Podobnie jak poprzedni ten skrypt słuzy do monitorowania stanu hostów. W tym celu próbuję pingnąć hosta docelowego po ICMP wykorzystując mechanizm WMI, oraz pingnąć hosta zródłowego po ICMP korzystając z zdalnego wywołania procedury po WMI. Jako wynik dostajemy 1 jeśli ping się powiódł , i 0 jeśli zawiódł. Oczywiście jeśli ping nie doszedł, skrypt jeszcze raz próbuje się dostać do hosta, a jesli i ta próba zakończy się niepowodzeniem, wysyła emaila do administratora.

On Error Resume Next

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set objArgs = WScript.Arguments

if objArgs.count > 0 then
    addr=objArgs(0)
else
    addr = "localhost"
end if

strComputer="localhost"
pingstatus=0
wmistatus=0

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT StatusCode FROM Win32_PingStatus where address = '"&addr&"'", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItems
if IsNull(objItem.StatusCode) then
pingstatus=0
else
pingstatus=1
end if
Next
Set objWMIServiceR = GetObject("winmgmts:\\" & addr & "\root\CIMV2")
Set colItemsR = objWMIServiceR.ExecQuery("SELECT StatusCode FROM Win32_PingStatus where address = '"&strComputer&"'", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItemsR
if IsNull(objItem.StatusCode) then
wmistatus=0
else
wmistatus=1
end if
Next

if (wmistatus=0 or pingstatus=0) then
wmistatus=0
pingstatus=0
WScript.Sleep 10000
Set objWMIServiceN = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItemsN = objWMIServiceN.ExecQuery("SELECT StatusCode FROM Win32_PingStatus where address = '"&addr&"'", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItemsN
if IsNull(objItem.StatusCode) then
pingstatus=0
else
pingstatus=1
end if
Next
Set objWMIServiceNR = GetObject("winmgmts:\\" & addr & "\root\CIMV2")
Set colItemsNR = objWMIServiceNR.ExecQuery("SELECT StatusCode FROM Win32_PingStatus where address = '"&strComputer&"'", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItemsNR
if IsNull(objItem.StatusCode) then
wmistatus=0
else
wmistatus=1
end if
Next
if (wmistatus=0 or pingstatus=0) then
Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory.
Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network).

Const cdoAnonymous = 0 'Do not authenticate
Const cdoBasic = 1 'basic (clear-text) authentication
Const cdoNTLM = 2 'NTLM

Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Brak odpowiedzi z serwera " & addr
objMessage.From = """RRdTooL Server Watch"" <pkrzysz@pjwstk.edu.pl>"
objMessage.To = "pkrzysz@pjwstk.edu.pl;kfaz@pjwstk.edu.pl"
objMessage.TextBody = "Serwer " & addr &"nie odpowiada na Pingi "&vbCRLF&_
"Trzeba sprawdzic http://peki.pjwstk.edu.pl/rrdtool "&vbCRLF&_
         "zobaczyć co się dzieje i ewentualnie zrestartować."

'==This section provides the configuration information for the remote SMTP server.

objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "dfs2"

'Type of authentication, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoNTLM

'Server port (typically 25)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

'Use SSL for the connection (False or True)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False

'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60

objMessage.Configuration.Fields.Update

'==End remote SMTP server configuration section==

objMessage.Send
end if
end if

wscript.echo wmistatus
wscript.echo pingstatus

wscript.echo Date() & " " & Time()

wscript.echo "WMI ping"
wscript.echo "ICMP Ping"
Wscript.echo cmpName

   Skrypcik oczywiście chodzi w Schedulerze co 10min, i jest podpiety do MRTG/rrdtool generujacego statystyki - http://peki.pjwstk.edu.pl/rrdtool

Monday, November 14, 2005 7:27:15 PM (Central European Standard Time, UTC+01:00) #    Comments [1]  |  Trackback

 

Automatyczne powiadamianie o restarcie/shutdownie#

  Po zupdetowaniu serwery się niestety muszą zrestartować. I rzadko im to wychodzi dobrze. Dlatego zawsze warto wiedzieć kiedy serwer będzie wykonywał tą operację. W tym celu zakładamy trigera na event log systemowy , na zdarzenie 1074, za pomocą eventtrigger.exe - dostępnego kazdym systemie xp i 2k3- i podpinamy do ponizszego skryptu.

On Error Resume Next

addr = "LSD"
msgTo = "kfaz@pjwstk.edu.pl;pkrzysz@pjwstk.edu.pl"
textBody="Serwer " & addr &" wła¶nie wszedł w tryb restart/shutdown "& vbCRLF

Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
strComputer ="localhost"
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'System' And EventCode=1074 ", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)

For Each objItem In colItems
textBody=textBody& "Category: " & objItem.Category & vbCRLF
textBody=textBody& "CategoryString: " & objItem.CategoryString&vbCRLF
textBody=textBody& "ComputerName: " & objItem.ComputerName&vbCRLF
strData = Join(objItem.Data, ",")
textBody=textBody& "Data: " & strData& vbCRLF
textBody=textBody&"EventCode: " & objItem.EventCode& vbCRLF
textBody=textBody&"EventIdentifier: " & objItem.EventIdentifier& vbCRLF
textBody=textBody&"EventType: " & objItem.EventType& vbCRLF
strInsertionStrings = Join(objItem.InsertionStrings, ",")
textBody=textBody& "InsertionStrings: " & strInsertionStrings& vbCRLF
textBody=textBody& "Logfile: " & objItem.Logfile& vbCRLF
textBody=textBody& "Message: " & objItem.Message& vbCRLF
textBody=textBody& "RecordNumber: " & objItem.RecordNumber& vbCRLF
textBody=textBody& "SourceName: " & objItem.SourceName& vbCRLF
textBody=textBody& "TimeGenerated: " & WMIDateStringToDate(objItem.TimeGenerated)& vbCRLF
textBody=textBody& "TimeWritten: " & WMIDateStringToDate(objItem.TimeWritten)& vbCRLF
textBody=textBody& vbCRLF
textBody=textBody& vbCRLF
textBody=textBody&"by peki"& vbCRLF
Exit For
Next


oSendUsingPickup = 1 'Send message using the local SMTP service pickup directory.
Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network).

Const cdoAnonymous = 0 'Do not authenticate
Const cdoBasic = 1 'basic (clear-text) authentication
Const cdoNTLM = 2 'NTLM

Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Serwer " & addr & " shutdown/restart"
objMessage.From = """RRdTooL Server Watch"" <pkrzysz@pjwstk.edu.pl>"
objMessage.To = msgTo
objMessage.TextBody = textBody

'==This section provides the configuration information for the remote SMTP server.

objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "dfs2"

'Type of authentication, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoNTLM

'Server port (typically 25)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

'Use SSL for the connection (False or True)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False

'Connection Timeout in seconds (the maximum time CDO will try to establish a connection to the SMTP server)
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60

objMessage.Configuration.Fields.Update

'==End remote SMTP server configuration section==

objMessage.Send


Function WMIDateStringToDate(dtmDate)
WScript.Echo dtm:
    WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _
    Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _
    & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2))
End Function

 

Skrypt ten wysyła emaila do administratora , ze maszyna przeszła w tryb restartu/shutdownu, oraz podaje odpowiedni wpis z dziennika zdarzeń. Jak mozna zauwazyc, w skrypcie sa pobierane wszystkie wartosci z logu system o id 1074, a nie tylko ostatnia - wynika to ze w WQL brakuję prostego słowa kluczowego TOP.

 

Monday, November 14, 2005 7:20:50 PM (Central European Standard Time, UTC+01:00) #    Comments [1]  |  Trackback

 

Czas stabilizacji#

 Nastał czas stabilizacji. Najpierw OpenOffice wyszedł z długo oczekiwanej wersji beta, a w piątek Microsoft wydał w końcu jeszzce bardziej oczekiwane Visual Studio 2005 i SQL Server 2005 w wersji stabilnej dla subskrybentów MSDN. Dobra passa do wydawania stabilnych edycji nie udziela sie tylko naszemu parlamentowi ;).

 

BSS | Windows
Saturday, October 29, 2005 12:11:33 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Ustawienie domyslnego dostepu do sieci przez VPN#

 Z powodu małego remontu 8 komputerów wylądowało na korytarzu. Ktoś wpadł na pomysł zeby je wpiąć do sieci za pośrednictwem wifi. Komputery zostały skonfigurowane,zaczeły widzieć sieć wifi, czas przyszedł aby wpiąć je do sieci uczelnianej za pośrednictwem VPNa. Stworzono więc ustawienia połaczenia dla wszystkich uzytkownikow, i właczono opcje RASForce=1 w kluczy Winlogon rejestru.

Problemy pojawiły się dosyć szybko - system sam zaczoł kasować pliki .pbk; po odpowiednio długim czasie, i to obojetnie od ustawienia praw dostępu do tych plikow. Kasował to raczej za mocno powiedziane - system je raczej czyścił, i pozostawiał na dysku z wielkoscią rowną 0 bajtów. Z powodu ustawienia opcji RASForce oczywiście nie mozna było sie zalogowac do komputera - system wymaga zestawienia sesji VPN zwsze, nawet dla lokalnego uzytkownika w trybie awaryjnym;więc pozostawało zdalne zmienianie rejestru/dogrywanie plików.

Szybko powstały nowe rozwiązania - po pierwsze wykorzystanie CMAK. Na w2k3 doinstalowujemy dodatkowy component administracyjny z standardowej instalacji, a następnie dpalamy miłego wizarda. Po przeklikaniu wszytskich opcji dostajemy plik .exe ktory odpalamy na komputerach z wifi i dostajemy nowe polączenie które juz njie zostanie usuniete.  Zalety takiego rozwiązania - prosta i szybka konfiguracja, mozemy wrzucic swoje logo. Wady: dalej jesteśmy skazani na RASForce

Jest jeszcze druga mozliwosc - tworzymy domyślne polaczenie dla wszystkich uzytkowników, nie zapominając odznaczyć opcji do pokazywania ikonki w trayu, oraz włączyć redial. Następnie wchodzimy do katalogu C:\Documents and Settings\All Users\Application Data\Microsoft\Network\Connections\Pbk i kopiujemy plik rasphone.pbk do jakiegoś innego pliku/katalogu. Ja skopiowałem do c:\winnt\system32\pjwstk.vpn. Następnie tworzymy nową lokalną polisę odpalajacą skrypt przy startupie komputera. Skrypt u mnie wygląda następująco:

rasdial pjwstk  user pass /PHONEBOOK:c:\winnt\system32\pjwstk.vpn /domain:DFS2

Gdzie pjwstk to nazwa wcześniej utworzonego połaczenia. User to uzytkownik o haśle pass na komputerze DFS2 (konto gość bez mozliwości logowania zdalnego/sieciowego; i z uprawnieniami do remote access)

Thursday, October 27, 2005 12:09:13 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Ustalanie domyslnego widoku w Explorerze na details#
 Całą sprawę załatwia wpis w rejestrze:

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams]
"Settings"=hex:09,00,00,00,04,00,00,00,00,00,00,00,00,77,7e,13,73,35,cf,11,ae,\
69,08,00,2b,2e,12,62,04,00,00,00,02,00,00,00,43,00,00,00


Lub prosty batch:

reg load HKU\TempUser "\\%1\c$\Documents and Settings\Default User\ntuser.dat"
reg add  HKU\Tempuser\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams /v Settings /t REG_BINARY /d 09000000040000000000000000777e137335cf11ae6908002b2e1262040000000200000043000000  /f
reg unload HKU\TempUser

reg load HKU\TempUser "\\%1\c$\Documents and Settings\mandatory\ntuser.man"
reg add  HKU\Tempuser\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams /v Settings /t REG_BINARY /d 09000000040000000000000000777e137335cf11ae6908002b2e1262040000000200000043000000  /f
reg unload HKU\TempUser


Oczywiście można też zrezygnować z domyślnego ustawienia widoku i ustawić domyślnie np. tylko widok na details do mój komputer np takim wpisem do rejestru:
[-HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU]


[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU]
"NodeSlots"=hex:02
"MRUListEx"=hex:01,00,00,00,00,00,00,00,ff,ff,ff,ff
"0"=hex:14,00,1f,50,e0,4f,d0,20,ea,3a,69,10,a2,d8,08,00,2b,30,30,9d,00,00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\BagMRU\0]
"NodeSlot"=dword:00000001
"MRUListEx"=hex:ff,ff,ff,ff



[-HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\1]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\Bags\1\Shell]
"Rev"=dword:00000000
"WFlags"=dword:00000000
"ShowCmd"=dword:00000001
"FFlags"=dword:00000000
"HotKey"=dword:00000000
"Buttons"=dword:ffffffff
"Links"=dword:00000000
"Address"=dword:ffffffff
"Vid"="{137E7700-3573-11CF-AE69-08002B2E1262}"
"Mode"=dword:00000004
"Sort"=dword:00000000
"SortDir"=dword:00000001
"Col"=dword:ffffffff
"ColInfo"=hex:00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,fd,df,df,fd,0f,\
  00,05,00,24,00,10,00,2e,00,46,00,00,00,00,00,01,00,00,00,02,00,00,00,03,00,\
  00,00,04,00,00,00,78,00,96,00,60,00,60,00,78,00,00,00,00,00,01,00,00,00,02,\
  00,00,00,03,00,00,00,05,00,00,00,ff,ff,ff,ff,cf,f3,a8,b0,33,43,ab,4b,88,73,\
  1c,cb,1c,ad,a4,8b,30,f1,25,b7,ef,47,1a,10,a5,f1,02,60,8c,9e,eb,ac,04,00,00,\
  00

Najważniejszą wartością jest oczywiście "Mode" - tu ustawiamy jaki będzie widok.

 Niestety z tego drugiego sposobu nie udało mi się zrobić skryptu.

Monday, September 12, 2005 10:53:59 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

copyprofile w xp a xcopy+acl na rejestr w w2k#
Jak się okazało w moim przypadku, xcopy i założenie acl na rejestr dziła znacznie lepiej. Dlaczego? Microsoftowe narzędzie po prostu nie kompuje katalogu Local Settings z katalogu profilu, a xcopy tak. O ile w większości aplikacji to nie ma znaczenia, to vs.net z zainstalowanym msdn będzie się odpalał ok 10min. Wynika to z tego że vs.net prawdopodobnie tworzy sobie indexy z msdn dla dynamic helpa, i zapisuje je w katalogu Local Settings\Microsoft Help
Saturday, September 10, 2005 11:35:43 AM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Wymuszenie quicklaucha w profilu#

Jak zawsze forum msfn okazało sie niezawodne. Do wymuszenia quiclaucha wystarczy wykonać następujący skrypt:

reg load HKU\TempUser "C:\Documents and Settings\Default User\ntuser.dat"
reg add HKU\Tempuser\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop /V TaskbarWinXP /t REG_BINARY /d 0c000000080000000200000000000000b0e22bd86457d011a9
6e00c04fd705a222001c000a0100001a000000010000000000000000000
000000000004c0000000114020000000000c000000000000046830
0000010000000a0b0485e898dbd0100d89ee42a8dbd010045fe5e898
dbd01000000000000000001000000000000000000000000000000130
114001f0fe04fd020ea3a6910a2d808002b30309d190023443a5c00
00000000000000000000000000000000cd971500310000000000af24
5cb9108057696e6e7400002000310000000000af24a3b910005072
6f66696c65730050524f46494c4553001900310000000000c1240892
100069653530302e30303000002800310000000000c124089210004
170706c69636174696f6e2044617461004150504c49437e310021003
10000000000c5229d9110004d6963726f736f6674004d4943524f537
e31002900310000000000d32232a61000496e7465726e65742045787
06c6f72657200494e5445524e7e31002400310000000000db2276ba
1000517569636b204c61756e636800515549434b4c7e310000008d00
00001c000000010000001c000000360000000df0adba8c0000001a0
0000003000000e7182d231000000049453530305f58314300433a5c5
7494e4e545c50726f66696c65735c49453530302e3030305c4170706
c69636174696f6e20446174615c4d6963726f736f66745c496e74657
26e6574204578706c6f7265725c517569636b204c61756e6368000010
000000050000a01a000000a3000000000000000800000002000000cc0
0000001000000030000004a0000000100000040003200e6010000
c424159f20004c61756e636820496e7465726e6574204578706c6f7265
722042726f777365722e6c6e6b004c41554e43487e322e4c4e4b000
00040000000020000003600320048020000c424159f20004c61756e6368
204f75746c6f6f6b20457870726573732e6c6e6b004c41554e434
87e312e4c4e4b00000036000000000000002c00320051000000ec2246392
00053686f77204465736b746f702e7363660053484f5744457e
312e53434600000052000000e000000000000000160000000000000000000
00016000000000000000100000001000000aa4f2868486ad0
118c7800c04fd918b437020000e0000000000000001600000000000000000
00000160000000000000001000000 /f
reg unload HKU\TempUser

reg load HKU\TempUser "C:\Documents and Settings\mandatory\ntuser.man"
reg add HKU\Tempuser\Software\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop /V TaskbarWinXP /t REG_BINARY
0c000000080000000200000000000000b0e22bd86457d011a9
6e00c04fd705a222001c000a0100001a000000010000000000000000000
000000000004c0000000114020000000000c000000000000046830
0000010000000a0b0485e898dbd0100d89ee42a8dbd010045fe5e898
dbd01000000000000000001000000000000000000000000000000130
114001f0fe04fd020ea3a6910a2d808002b30309d190023443a5c00
00000000000000000000000000000000cd971500310000000000af24
5cb9108057696e6e7400002000310000000000af24a3b910005072
6f66696c65730050524f46494c4553001900310000000000c1240892
100069653530302e30303000002800310000000000c124089210004
170706c69636174696f6e2044617461004150504c49437e310021003
10000000000c5229d9110004d6963726f736f6674004d4943524f537
e31002900310000000000d32232a61000496e7465726e65742045787
06c6f72657200494e5445524e7e31002400310000000000db2276ba
1000517569636b204c61756e636800515549434b4c7e310000008d00
00001c000000010000001c000000360000000df0adba8c0000001a0
0000003000000e7182d231000000049453530305f58314300433a5c5
7494e4e545c50726f66696c65735c49453530302e3030305c4170706
c69636174696f6e20446174615c4d6963726f736f66745c496e74657
26e6574204578706c6f7265725c517569636b204c61756e6368000010
000000050000a01a000000a3000000000000000800000002000000cc0
0000001000000030000004a0000000100000040003200e6010000
c424159f20004c61756e636820496e7465726e6574204578706c6f7265
722042726f777365722e6c6e6b004c41554e43487e322e4c4e4b000
00040000000020000003600320048020000c424159f20004c61756e6368
204f75746c6f6f6b20457870726573732e6c6e6b004c41554e434
87e312e4c4e4b00000036000000000000002c00320051000000ec2246392
00053686f77204465736b746f702e7363660053484f5744457e
312e53434600000052000000e000000000000000160000000000000000000
00016000000000000000100000001000000aa4f2868486ad0
118c7800c04fd918b437020000e0000000000000001600000000000000000
00000160000000000000001000000 /f

reg unload HKU\TempUser

Przy okazji widać jak w prosty sposób dorzucić wartości do rejestru innego użytkownika

 

Plik QuickLaunchDef.cmd (3.88 KB)

Thursday, September 08, 2005 7:19:11 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

copyprofile dla windows 2000#
 NIestety ale narzędzia copyprofile.exe nie ma dla systemu windows 2000. W związkui z tym używałem skryptu:

rd /q /s "C:\Documents and Settings\risasi\Local Settings\Temp"
rd /q /s "C:\Documents and Settings\risasi\My Documents"
xcopy   "C:\Documents and Settings\risasi" "C:\Documents and Settings\mandatory" /s /E /C /Y /I /H
xcopy   "C:\Documents and Settings\risasi" "C:\Documents and Settings\Default User" /s /E /C /Y /I /H
attrib "c:\Documents and Settings\mandatory\ntuser.pol" -h -s
del "c:\Documents and Settings\mandatory\ntuser.pol"
attrib "c:\Documents and Settings\Default User\ntuser.pol" -h -s
del "c:\Documents and Settings\Default User\ntuser.pol"
echo y| cacls "C:\Documents and Settings\mandatory" /t /e /g everyone:r
echo y| cacls "C:\Documents and Settings\Default User" /t /e /g everyone:r
attrib -H "C:\Documents and Settings\mandatory\NTUSER.DAT"
ren "C:\Documents and Settings\mandatory\NTUSER.DAT" "NTUSER.MAN"
attrib +H "C:\Documents and Settings\mandatory\NTUSER.MAN"
rd /q /s "C:\Documents and Settings\risasi"

Gdzie risasi jest użytkownikiem z którego są tworzone profile mandatoryjny i Default User.

O ile z profilem Default User nie ma żadnego problemu, to profil madatroyjny się wykrzacza - powód - brak dostępu do kluczy rejestru.
Aby to zmienić trzeba zmienić w użytkowniku risasi ACL do kluczu rejestru HKCU. Jeśli to zrobimy, poolisy będą aplikowane dla danego profilu, ale niestety nie dla Explorera (tzn. takie polisy jak skrypty logon\logoff zabronienie regedita, cpl; ale już nie active desktop czy modyfikacje desktopu/menu start).


Aby polisy były w pełni aplikowane dla danego profilu, musimy jeszcze zmienić acl dla następujących kluczy rejestru:

HKCU\Software\policies
HKCU\Software\Microsoft\Windows\Current Version\Group Policy

Do zmiany acl można użyć subinacl.exe z W2kResKit. Odpowiedni skrypcik wygląda następująco:

subinacl /subkeyreg HKEY_CURRENT_USER /replace=PJWSTK\risasi=Everyone
subinacl /subkeyreg HKEY_CURRENT_USER\Software\Policies /replace=PJWSTK\risasi=Everyone
subinacl /subkeyreg "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Group Policy" /replace=PJWSTK\risasi=Everyone


Thursday, September 08, 2005 2:27:42 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Firefox a profil mandatoryjny#
   Profile z liska oczywiscie mozna składować w dowolnym katalogu.Aby to zrobić , wystarczy wpisać do pliku profiles.ini w katalogu %USERPROFILE%\Application Data\Mozilla\Firefox\profiles.ini sciezkę do katalogu w którym mają być przechowywane dane. Przykładowy plik wygląda następująco:

[General]
StartWithLastProfile=1

[Profile0]
Name=zetka
IsRelative=0
Path=Z:\FireFoxProfiles
Default=1

   Poszczególne opcje odnoszą się do tego czy Ff ma pytać się o profil uzytkownika, następnie jest podana nazwa profilu, zaznaczone jest ze sciezka nie jest relatywna, podana jest sciezka do profilu, i profil jest ustawiany jako domyślny.

   Wadą profili Ff jest to ze tylko jedna instancja programu moze na raz korzystać z danego profilu. Jezeli uzytkownik zaloguje sie na dwóch lub więcej komputerach na raz, to będzie poproszony o utworzenie tymczasowego profilu. Jest to denerwujące, szczególnie ze Ff ma czasami problem ze zwalnianiem blokady po wylogowywaniu, co prowadzi do tego iz nawet jesli uzytkownik jest zalogowany tylko na jednym komputerze, to nadal pojawia sie monit o utworzenie kolejnego profilu.

   Ostatnia kwestia dotyczącą profili jest kopiowanie pliku  profiles.ini do katalogu %USERPROFILE%\Application Data\Mozilla\Firefox\profiles.ini. W tym celu utwozyłem skrypt firefox.vbs, oraz podmienilem go z firefox.exe w skrótach.Ponizej znajduję się kod skryptu:

Dim objFSO
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set WSHShell = WScript.CreateObject("WScript.Shell")
If objFSO.FolderExists("Z:\FireFoxProfiles") = FALSE Then
    objFSO.CreateFolder "Z:\FireFoxProfiles"
End If
If objFSO.FolderExists(WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\Mozilla") = FALSE Then
    objFSO.CreateFolder WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\Mozilla"
End If
If objFSO.FolderExists(WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\Mozilla\Firefox") = FALSE Then
     objFSO.CreateFolder WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\Mozilla\Firefox"
End If


objFSO.CopyFile "G:\Program Files\Mozzila Firefox\profiles.ini",WshShell.ExpandEnvironmentStrings("%USERPROFILE%")+"\Application Data\Mozilla\Firefox\profiles.ini",true
WSHShell.Run "firefox.exe", 1, false
Set WSHShell = Nothing
Set objFSO = Nothing
WScript.Quit(0)

 W skrypcie załozono ze katalog skrypt znajduje sie w katalogu z Firefoxem na dysku G:\, oraz w tym samym katalogu znajduję się spreparowany plik profiles.ini. Katalog uzytkownika to z:\.

Monday, August 01, 2005 4:11:28 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

Desktop dla profilu mandatoryjnego#

   Dużą wadą profilów mandatoryjnych jest to że użytkownik nie może nic zapisywać na desktopie. Aby to obejść możemy do startupu dołączyć poniższy skrypcik:

On Error Resume Next
Dim WshShell
Dim fso
Dim MyFile
Dim d , s
Dim DriveSpec
Dim WshNetwork
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")
Set d = fso.GetDrive(fso.GetDriveName("\\Z\"&WshNetwork.UserName))
If (d.FreeSpace/1024>2000) Then
        If (fso.FolderExists("\\Z\"&WshNetwork.UserName&"\Desktop")) Then
        Else
            fso.CreateFolder("\\Z\"&WshNetwork.UserName&"\Desktop")   
        End if
        WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop", "Z:\Desktop", "REG_SZ"
End IF

   Skrypt ten sprawdza czy istnieje share \\z\nazwa_uzytkownika i ile uzytkownika ma wolnego na podanym sharze miejsca do zapisu. Jeśli więcej niz 2MB(wielkość podana przypadkowo) to sprawdzane jest czy istnieje katalog desktop, jesli nie to katalog ten jest zakładany. Nastepnie zapisujemy sciezkę do katalogu w rejestrze.

   W podobny sposób mozna zapisywac ustawienia IE uzytkownika:

On Error Resume Next
Dim WshShell
Dim fso
Dim MyFile
Dim d , s
Dim DriveSpec
Dim WshNetwork
Set WshShell = WScript.CreateObject("WScript.Shell")
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")
Set d = fso.GetDrive(fso.GetDriveName("\\Z\"&WshNetwork.UserName))
If (d.FreeSpace/1024>2000) Then
        If (fso.FolderExists("\\Z\"&WshNetwork.UserName&"\IE")) Then
        Else
            fso.CreateFolder("\\Z\"&WshNetwork.UserName&"\IE")
        End if
        If (fso.FolderExists("\\Z\"&WshNetwork.UserName&"\IE\Favorites")) Then
        Else
            fso.CreateFolder("\\Z\"&WshNetwork.UserName&"\IE\Favorites")
        End if
        If (fso.FolderExists("\\Z\"&WshNetwork.UserName&"\IE\Cookies")) Then
        Else
            fso.CreateFolder("\\Z\"&WshNetwork.UserName&"\IE\Cookies")
        End if
        If (fso.FolderExists("\\Z\"&WshNetwork.UserName&"\IE\History")) Then
        Else
            fso.CreateFolder("\\Z\"&WshNetwork.UserName&":\IE\History")
        End if
        WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Favorites", "Z:\IE\Favorites", "REG_SZ"
        WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Cookies", "Z:\IE\Cookies", "REG_SZ"
        WshShell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\History", "Z:\IE\History", "REG_SZ"

End IF

Monday, August 01, 2005 3:32:57 PM (Central European Standard Time, UTC+01:00) #    Comments [0]  |  Trackback

 

All content © 2010, Krzysztof Pietrzak
On this page
This site
Calendar
<March 2010>
SunMonTueWedThuFriSat
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910
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