A blogban leírtak a szerzők saját véleménye, és nem a munkáltatójuké.

Email cím megadása FSRM kvótákban

(A vizsgaidőszak végével most van egy kis lélegzetvételnyi szünet, így most jut idő a félév alatt felgyűlt IT feladatok megoldására.) Adott a Windows Serverbe beépített File Server Resource Manager (FSRM), amivel kvótákat meg fájl kategorizálásokat, jelentéseket meg hasonló feladatokat lehet megcsinálni. Jó bevezetők:

Lehet szépen kvótákat beállítani, majd ha az elér egy bizonyos százalékot, akkor email értesítést lehet küldeni a felhasználóknak. A gond csak az, hogy ez nekünk egy olyan szerveren volt, ami nem tartományi tag. Helyi felhasználóhoz – már amennyire én tudom – pedig nem lehet email címet megadni (ezen minden egyes alkalommal meglepődöm). Úgyhogy a kvóta értesítés tesztelése során a következő hibát naplózta a rendszer:

Log Name:      Application
Source:        SRMSVC
Event ID:      12306
Level:         Error
Description:
A File Server Resource Manager Service email action could not be run. 

Operation:
 Running email action.
 Quota limit reached.
 Processing File Server Resource Manager event

Context:
 Action type: Email Action
 Mail-from address: FSRM@mit.bme
 Mail-reply-to address: FSRM@mit.bme
 Mail-to address:
 Mail-CC address:
 Mail-BCC address:
 Mail subject: Quota limit exceeded
 Mail message text: User SERVER\user has reached the quota limit for quota on d:\quotatest\micskeiz on server SERVER. The quota limit is 100.00 MB and the current usage is 81.50 MB (81% of limit).
 Quota path: d:\quotatest\micskeiz
 Threshold percent: 100

Error-specific details:
 Error: IFsrmEmailExternal::SendMail, 0x8004531c, The parameter 'addresses' cannot be an empty string.
Parameter name: addresses

És tényleg, a Mail-to mező üres, így nem csoda, hogy nem tudja elküldeni. Keresgettem, de mintha ez másnak valahogy nem tűnt volna még fel (talán ez kapcsolódik kicsit a témához, de itt meg később AD-ről beszélnek már: Server 2008: In FSRM, where is does variable [Source Io Owner Email] come from). Úgyhogy valamit kézzel kellett hackelni.

  • A GUI-ról a TO mezőt nem lehet szerkeszteni.
  • Parancssorból (dirquota.exe) lehetne már módosítani a TO értéket is (lásd: Configuration files for notifications in File Server Resource Manager). Azonban a [Source File Owner] makró SERVER\login formában adja vissza a felhasználót, így azt közvetlenül nem lehet felhasználni még akkor se, ha login@domain formájú email címeink vannak.
  • Maradt tehát az, hogy valami saját parancsot hívunk meg.

Egy egyszerű PowerShell script elvégzi a feladatot. A következőkre kell figyelni:

  • Command: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
  • Command arguments: -command d:\scripts\Send-MailMessage2.ps1 -userNameWithDomain ‘[Source Io Owner]’ -quotaRemotePath ‘[Quota Remote Paths]’ -quotaLimit ‘[Quota Limit MB]’ -quotaUsed ‘[Quota Used MB]’ -quotaTreshold ‘[Quota Threshold]’
  • Az argumentumoknál tehát ‘ ‘ karaktereket kell használni a stringeknél és nem “-t. Ezen kívül nem lehet script blockot ({} közötti parancsok) átadni a powershell.exe-nek ha nem powershellből hívjuk meg
  • A parancsot Local Service-ként nem futtatta nekem le, csak Local Systemként.

Végezetül a scipt:

# Name:   Send-MailMessage2
# Author: Micskei Zoltán
# Date:   2010.06.29.
# Desc:   sends a custom quota notification
# Param:
#
 
param(
 [string] $userNameWithDomain,
 [string] $quotaRemotePath,
 [string] $quotaLimit,
 [string] $quotaUsed,
 [string] $quotaTreshold
)
 
$DEFAULT_DOMAIN = "mydomain.hu"
$FROM = "FSRM@mydomain.hu"
$SMTP_SERVER = "localhost"
$SERVER_ALIAS = "\\fileserver.mydomain.hu"
$SERVER_NAME = "\\SERVER"
 
if ( ! $userNameWithDomain.Contains("\") )
{
 Write-Error("userNameWithDomain is in wrong format, does not contain \")
 return
}
 
$to = [String]::Format("{0}@{1}", ($userNameWithDomain.Split("\"))[1], $DEFAULT_DOMAIN)
$quotaRemotePath = $quotaRemotePath.Replace($SERVER_NAME,$SERVER_ALIAS)
 
$subject = "Kvota tullepes a $quotaRemotePath konyvtaron"
 
$body = "Tullepted a $quotaLimit MB megengedett kvota $quotaTreshold %-at a $quotaRemotePath konyvtaron. Aktalis hasznalat: $quotaUsed MB. Lassan torolj valamit a megosztasrol!"
 
Send-MailMessage -To $to -Subject $subject -From $FROM -Body $body -SmtpServer $SMTP_SERVER
 
Write-output "Message sent to $to"

Azért jó lett volna, ha van valami beépített megoldás erre. Megkérdeztem a Technet fórumon,de ott se tudtak jobbat:)

Active Directory alkalmazás partíciók tartalmának megnézése

Csak egy rövid emlékeztető: az egyik Active Directory tartományvezérlőnket nyugdíjaztuk, és a DC lefokozása (demote) közben a következő figyelmeztető üzenetet kaptam:

Azaz az adott tartományvezérlő tárolja ezekből az alkalmazás partíciókból az utolsó replikát, így ha lefokozzuk ezt a DC-t, akkor ezek az adatok elvesznek.

Bővebben: Application directory partitions and domain controller demotion: Active Directory

Itt csak az nem szerepelt, hogy a tartalmát hogyan lehet megnézni ezeknek a partícióknak. A Sysinternals AD Explorerben nem jelentek meg, de az ldifde segítségével könnyen meg lehet nézni a tartalmukat:

ldifde -f dump.txt  -s server -v -d dc=t

Unexptected server authentication certificate

Ez csak egy újabb példa, hogy hogyan írjunk rossz hibaüzenetet (The connection has been terminated because an unexpected server authentication certificate was received from the remote computer.):

Lecseréltem a tanúsítványt pont a szerveren, és utána Remote Desktop belépéskor adta ezt. Azt hittem először, hogy még a régit próbálja keresni, valahol ez el van tárolva. Némi registry túrás meg olvasgatás után kiderült, hogy más a probléma (Server Authentication Certificate Error for Remote Desktop Connection): az újabb RD-nak olyan tanúsítvány kell, amiben van Certificate Revocation List kiegészítés (CRL, ebben van benne, hogy hol érhetőek el az adott tanúsítványszolgáltató által kiállított, de később visszavont tanúsítványok listája). Ennyit kéne csak beleírni a hibaüzenetbe, és máris könnyebb lenne kitalálni, hogy mit kell tenni.

NPS log fájlok olvasása

A wifi access pointunknál felhasználóneves és jelszavas azonosítás van, amit az access point RADIUS-on keresztül ellenőriztet. A beérkező kéréseket a Windows Server 2008-ba beépített Network Policy Server (NPS) dolgozza fel. Ha valami gond van, akkor lehet nézni a napló fájlját. Ez a régi verzióban (akkor még IAS-nak hívták az NPS-t) egy CSV fájl volt, az újabbakban már XML bejegyzések vannak. Valami hasonló formájú egy-egy bejegyzés:

<Event><Timestamp data_type=”4″>06/17/2010 14:57:47.674</Timestamp><Computer-Name data_type=”1″>SERVER</Computer-Name><Event-Source data_type=”1″>IAS</Event-Source><NAS-IP-Address data_type=”3″>192.168.1.2</NAS-IP-Address><Called-Station-Id data_type=”1″>0034df3423ab</Called-Station-Id><Calling-Station-Id data_type=”1″>00213478bcda</Calling-Station-Id><NAS-Identifier data_type=”1″>0034df3423ab</NAS-Identifier><NAS-Port data_type=”0″>46</NAS-Port><Framed-MTU data_type=”0″>1400</Framed-MTU><NAS-Port-Type data_type=”0″>19</NAS-Port-Type><Client-IP-Address data_type=”3″>192.168.1.2</Client-IP-Address><Client-Vendor data_type=”0″>0</Client-Vendor><Client-Friendly-Name data_type=”1″>FTSRG Asus Wifi</Client-Friendly-Name><User-Name data_type=”1″>ftsrg\user</User-Name><Proxy-Policy-Name data_type=”1″>FTSRG Wifi – Connection Request</Proxy-Policy-Name><Provider-Type data_type=”0″>1</Provider-Type><SAM-Account-Name data_type=”1″>ftsrg\user</SAM-Account-Name><Fully-Qualifed-User-Name data_type=”1″>ftsrg\user</Fully-Qualifed-User-Name><NP-Policy-Name data_type=”1″>FTSRG Wifi student – Network Policy</NP-Policy-Name><Class data_type=”1″>311 1 192.168.1.1 06/12/2010 00:08:37 321</Class><Quarantine-Update-Non-Compliant data_type=”0″>1</Quarantine-Update-Non-Compliant><Authentication-Type data_type=”0″>11</Authentication-Type><MS-Extended-Quarantine-State data_type=”0″>0</MS-Extended-Quarantine-State><MS-Quarantine-State data_type=”0″>0</MS-Quarantine-State><Packet-Type data_type=”0″>1</Packet-Type><Reason-Code data_type=”0″>0</Reason-Code></Event>

Ilyenből van jó pár akár egy kapcsolódási kísérlet esetén, és ebben kell megtalálni, hogy mi a gond:). Viszonylag sok felesleges bejegyzés is van benne (legalábbis ami a mi környezetünkben mindig ugyanaz, így nincs jelentősége), és a legtöbb mezőnél nincsenek feloldva a konstansok. Találtam olyan eszközt, ami az IAS logját feldolgozza (iasparse.exe), de ezt legjobb tudomásom szerint NPS-re nem frissítették. A Log Parsert említik még pár helyen, de ez amennyire látom ugyanúgy nem “érti” az NPS logjait, csak képes hatékonyan feldolgozni XML vagy CSV fájlokat. Vannak fizetős eszközök, amik ismerik az NPS-t is (pl. Sawmill) de legnagyobb meglepetésemre ingyenen eszközt vagy scriptet nem találtam. Úgyhogy nem maradt más hátra, valamit nekem kellett összedobni.

Mivel XML alapú a log, ezért könnyen adódott, hogy egy egyszerű XSLT-vel HTML-t generálok belőle. A neheze egyedül annyi volt, hogy megtalálni, hogy pl. a Packet-Type esetén az 1-es érték mit jelent. Ezek segítettek:

Természetesen azért minden nem lett meg. Pl. a dokumentáció szerint a Packet-Type mezőnek nincs 11-es értéke, közben mégis:) Ez másnak is feltűnt, de pontos választ ott se kaptak. Egy nagyságrenddel azért most már könnyebb olvasni a logokat.

A mellékelt xlst transzformációt kell használni, a log fájlba be kell rakni a pl. a következő sorokat:

<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="nps-log.xsl"?>
<events>
....
</events>

Megszemélyesítési (impersonation) hiba saját WMI providerben

(ez még egy régebbi történet, csak most jutottam el oda, hogy leírjam)

Az egyik IRF háziban jött elő, hogy egy hallgató meg szeretett volna nyitni egy szöveges fájlt a WMI provider kódján belül, de a következő hibát kapta:

.NET Runtime version 2.0.50727.3082 - Unexpected exception thrown from the provider:
System.IO.IOException: Either a required impersonation level was not provided, or the provided impersonation level is invalid.

A fenti hibához egyébként a következő hibakód tartozik: ERROR_BAD_IMPERSONATION_LEVEL 1346 (0x542)

Mi az a megszemélyesítés (impersonation)?

A megszemélyesítés (impersonation) beállítás mondja meg, hogy ha a providernek valamilyen további műveletet (pl. fájl olvasás, hálózati kapcsolat) kell végrehajtania, azt kinek a nevében tegye. Használja-e azt a felhasználót, akinek a nevében fut a provider, vagy használja a WMI hívást kiadó felhasználó adatait (ebben az esetben beszélünk megszemélyesítésről)?

A WMI DCOM-ot használ a távoli hívásokhoz, itt a következő beállítási lehetőségeink vannak:

  • 0 – Default: Reads the local registry for the default impersonation level.
  • 1 – Anonymous: Hides the credentials of the caller. Calls to WMI may fail with this impersonation level.
  • 2  – Identify: Allows objects to query the credentials of the caller. Calls to WMI may fail with this impersonation level.
  • 3 – Impersonate: Allows objects to use the credentials of the caller. This is the recommended impersonation level for WMI Scripting API calls.
  • 4 – Delegate: Allows objects to permit other objects to use the credentials of the caller. This impersonation, which will work with WMI Scripting API calls but may constitute an unnecessary security risk, is supported only under Windows 2000

Hogyan lehet beállítani a megszemélyesítést a providerben?

Általános WMI provider esetén az ImpersonationLevel tulajdonságot kéne beállítani a __Win32Provider CIM osztályon (lásd: Impersonating a Client).

Mi viszont a .NET-es WMI Provider Extensions kiegészítést használtuk, amiben .NET-es attribútumok segítségével lehet megadni a beállításokat, és ezek utána akkor az installutil-es telepítés során átkerülnek a CIM osztály definíciójába. Itt a WmiConfigurationAttribute IdentifyLevel tulajdonsága az, ami elvileg a megszemélyesítést befolyásolja. A leírás szerint:

Gets or sets a value that specifies whether the WMI provider can impersonate its callers. If the value is false, the provider cannot impersonate, and if the value is true, the provider can impersonate.

(Azonban látni fogjuk, hogy ez nem teljesen így működik.)

Hogyan lehet beállítani a megszemélyesítést a kliensben?

A fenti beállítások még csak azt mondják meg, hogy engedélyezi-e egyáltalán a megszemélyesítést a provider, ezen kívül még a WMI kérés kliensének is meg kell adni, hogy milyen szintet akar használni.

Powershell esetén ezt a Get-WmiObject cmdlet Impersonation paraméterében lehet megadni, 0-4 érétket vár a fent leírtaknak megfelelően.

Hogyan lehet akkor megoldani a problémát?

A fentiek alapján akkor úgy gondoltam, hogy true-ra kell állítani az IdentifyLevel értékét, majd 3-at (Impersonate) kell megadni az Impersonation paraméternek, és megy is minden rendben. Hát nem:)

A providerben továbbra is a fenti kivételt kaptam, a kliens pedig egyszerűen nem látta annak a tulajdonságnak az értékét, amiben a fájlművelet volt. Ezért kicsit kibővítettem a kódot, hogy kiírja a hívás során, hogy kinek a nevében fut és mi az aktuális ImpersonationLevel. Ez lett a kimenet:

Provider started
Provider running by: THEFAMILY\zoltan.micskei
Bind method called
Get Property1
Get property2
  Current identity: THEFAMILY\vito.mascarpone,
  Impersonation level: Identification
  System.IO.IOException: Unknown error "1346".

Látszik, hogy a hívó személyét megkapja rendesen a provider, azonban nem Impersonate az aktuális szint, hanem Identification. No most akkor mit is csinál az IdentifyLevel? Ha wbemtest.exe segítségével megnézzük a provider példányának MOF reprezentációját, akkor ezt látjuk:

instance of WmiProviderSample
{
  Property1 = "Some string";
  Property2 = NULL;
};

A .NET WMI Extensions úgy működik, hogy létrehoz minden providerhez a WMI_extension osztály egy példányát, és abban tárol még információkat a providerhez:

instance of WMI_extension
{
AssemblyName = "WmiProviderSample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
AssemblyPath = "file:///C:/temp/WmiProviderSample/WmiProviderSample.exe";
CLRVersion = "v2.0.50727";
CLSID = "{54D8502C-527D-43f7-A506-A9DA075E229C}";
HostingModel = "Decoupled:COM";
Name = "WmiProviderSample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
SecurityDescriptor = "O:WDG:WDD:(A;;0x1;;;WD)";
 };

Hát itt nyoma sincs az Impersonation beállításnak. A WMI_extension a __Win32Provider osztályból származik, annak van ImpersonationLevel attribútuma, de az alapértelmezés szerint nulla, így ez a provider példány tényleg nem fogja engedni a megszemélyesítést.
Kipróbáltam, hogy mi a különbség, ha az IdentifyLevel értékét false állítom, ekkor így nézett ki a megfelelő objektum (vigyázat, ahhoz, hogy ez a változtatás életbe lépjen, a providert az installutil segítségével újra kell telepíteni):

instance of WMI_extension
{
AssemblyName = "WmiProviderSample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
AssemblyPath = "file:///C:/temp/WmiProviderSample/WmiProviderSample.exe";
CLRVersion = "v2.0.50727";
CLSID = "{54D8502C-527D-43f7-A506-A9DA075E229C}";
HostingModel = "Decoupled:COM:FoldIdentity(FALSE)";
Name = "WmiProviderSample, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null";
SecurityDescriptor = "O:WDG:WDD:(A;;0x1;;;WD)";
 };

Félkövérrel kiemeltem a különbséget. Mit csinál ez a FoldIdentity?

The following example shows the FoldIdentity specifier for the HostingModel property set to FALSE, which allows the provider to impersonate the client.
Decoupled:Com:FoldIdentity(FALSE)

Gratulálunk:-) Újra lefuttatva a kérést most már rendesen ment a megszemélyesítés, a kérést a hívó nevében hajtotta végre a provider, és így sikeresen le tudta kérdezni az adott tulajdonságot.
A megoldás tehát annyi, hogy – amennyire én látom – hibás az MSDN dokumentáció, és az IdentifyLevel false értéke engedélyezi a megszemélyesítést.

Eseménynapló elemek automatikus továbbítása

Windows Vista óta lehet olyat, hogy az Eseménynapló bizonyos eseményeit automatikusan továbbítsuk egy központi gép felé. A funkció neve Event Forwarding, az Eseménynapló Subscriptions részében lehet beállítani. Két féle üzemmódban működhet:

A második módszert csoportházirendből lehet beállítani, az elsőt kézzel is meg lehet csinálni. A fenti leírások elég pongyolák (ráadásul pl. a Techneten nincs is semmi a source initiated módszerről:), ezt a blog bejegyzést érdemes inkább megnézni: Quick and Dirty Large Scale Eventing for Windows.

Kézzel kipróbálva a collector initiated módszert ment is rendesen. [Egy megjegyzés csak: a fenti leírással ellentétben a központi gép fiókját elég berakni csak az Event log readers csoportba, nem kell a Local administratorsba.]

Gondoltam akkor beállítom, hogy a tartományban lévő minden szerver egy központi gépre továbbítsa a Critical és Error típusú bejegyzéseket. Ha már van tartományunk, akkor viszont minden beállítást próbáltam csoportházirendben megadni. A következőket kell elvégezni:

  • WinRM engedélyezése és beállítása (Windows Components/Windows Remote Management (WinRM)/WinRM Service): Az “Allow automatic configuration of listeners” beállítást kell engedélyezni. Én korlátoztam, hogy csak a belső hálóhoz tartozó IP címeken figyeljen.
  • WinRM kiengedése a tűzfalon (Windows Settings/Security Settings/Windows Firewall with Advanced Security/Inbound Rules): “Windows Remote Management (HTTP-In)” beépített szabály engedélyezése. Arra figyeljünk, hogy a Public profilban azért ne engedélyezzük.
  • Event Forwarding beállítása (Windows Components/Event Forwarding): “Configure the server address, refresh interval, and issuer certificate authority of a target Subscription Manager” beállítás megadása, Server=collect_FQDN_neve értékkel.
  • WinRM szolgáltatás automatikusan induljon.

Ezzel fut a WinRM minden gépen, és a gépek megpróbálnak a Subscription Manager beállításnál megadott géphez csatlakozni, hogy lekérjék, hogy milyen eseményeket kell nekik továbbítani.

Most már csak be kell állítani a központi gépen, hogy fogadja az eseményeket: Eseménynapló / Subscriptions megnyitása. Itt igent mondani arra, hogy az Event Collector szolgáltatást indítsa el automatikusan. Ezek után létrehoztam egy új, push típusú előfizetést:

Viszont az OK után a következő hibával fogadott:

És az előfizetés tényleg nem is működött:

A Runtime status leírást megnézve a hibaüzenethez már tartozott egy hibakód is: “Code (0x8033808F): The client could not start a valid listener to receive subscription events based on the specified input settings.” Viszont a google nulla találatot adott erre a hibakódra, úgyhogy el kellett kezdeni gondolkozni, hogy mit is jelent ez:-)

1. WinRM ellenőrzése: egy távoli gépről kiadva a következő kérést gond nélkül kaptam választ:

winrm id -r:kozponti_gep

2. WinRM listener megnézése a központi gépen:

c:>winrm enum winrm/config/listener
Listener [Source="GPO"]
 Address = *
 Transport = HTTP
 Port = 5985
 Hostname
 Enabled = true
 URLPrefix = wsman
 CertificateThumbprint
 ListeningOn = 10.40.1.100

Látszik, hogy van rendesen listener, a beállítások csoportházirendből származnak (Group Policy Object), HTTP-t használ, és a gép belső IP címén figyel (ez az az interfésze, amin a többi szerver a SubscriptionManagernél megadott FQDN-en eléri). A hostname nem volt kitöltve, de ezt sehol máshol nem láttam kitöltve. Azért megpróbáltam megadni (WinRM set winrm/config/listener?Transport=HTTP+Address=* @{Hostname = gep_FQDN}), de ez nem segített. Látszólag valami WinRM gond van, ezért megpróbáltam lefuttatni a winrm quickconfig parancsot, hogy hátha még valami egyéb beállítás is kell. Legnagyobb meglepetésemre a WinRM azt mondta, hogy a tűzfal szabályok nincsenek meg (holott csoportházirendben az is be volt állítva), viszont nem is tudta létrehozni azokat.

WinRM quickconfig megjavítása

Ezt mondta a quickconfig:

Error: One or more update steps could not be completed.
Unable to enable the firewall for WinRM.

Holott a tűzfal beállításait megnézve a WinRM portja (5985) ki volt engedve. Leszedtem a csoportházirend beállítást, és megpróbáltam, hogy a winrm engedélyezhesse a tűzfal szabályt, de ugyanez volt az eredmény. Jobb ötletem nem volt, úgyhogy kitöröltettem az összes WinRM beállítást:

winrm invoke restore winrm/config @{}

Utána pedig megnéztem, hogy ténylegesen mit is csinál a quickconfig. A winrm.cmd a c:\windows\system32\winrm.vbs scriptet hívja meg. Ez egy 4000 soros VBScript, ami annyit csinál, hogy feldolgozza a paramétereket, elvégzi a hibakezelést, és meghívja a WSMAN.Automation osztályt. A Private Function QuickConfigRemoting függvényt kell megkeresni, és itt érdemes a benne lévő wscipt.echo hívásokat kikommentezni. Így aztán ha lefuttatjuk, akkor látszik, hogy miket küld el és kap vissza:

C:\Windows\system32>winrm qc

analysisOutputXml:
<cfg:AnalyzeService_OUTPUT xmlns:cfg="http://schemas.microsoft.com/wbem/wsman/1/
config/service"><cfg:RemotingEnabled>true</cfg:RemotingEnabled></cfg:AnalyzeServ
ice_OUTPUT>
WinRM already is set up to receive requests on this machine.

analysisOutputXml:
<cfg:Analyze_OUTPUT xmlns:cfg="http://schemas.microsoft.com/wbem/wsman/1/config/
service" xml:lang="en-US"><cfg:RemotingEnabled>false</cfg:RemotingEnabled><cfg:R
esults>Enable the WinRM firewall exception.
</cfg:Results><cfg:EnableRemoting_INPUT><cfg:EnableFirewallException>true</cfg:E
nableFirewallException></cfg:EnableRemoting_INPUT></cfg:Analyze_OUTPUT>

updateInputXml:
<cfg:EnableRemoting_INPUT xmlns:cfg="http://schemas.microsoft.com/wbem/wsman/1/c
onfig/service"><cfg:EnableFirewallException>true</cfg:EnableFirewallException></
cfg:EnableRemoting_INPUT>
WinRM is not set up to allow remote access to this machine for management.
The following changes must be made:

Enable the WinRM firewall exception.

Make these changes [y/n]? y

updateOutputXml:
<cfg:EnableRemoting_OUTPUT xmlns:cfg="http://schemas.microsoft.com/wbem/wsman/1/
config/service" xml:lang="en-US"><cfg:Status>failed</cfg:Status><cfg:Results>Una
ble to enable the firewall for WinRM.
</cfg:Results><cfg:EnableFirewallException>failed</cfg:EnableFirewallException><
/cfg:EnableRemoting_OUTPUT>
Error: One or more update steps could not be completed.

Unable to enable the firewall for WinRM.

A hiba most is ugyanaz. Az Analyze_OUTPUT kérés eredménye, hogy milyen változtatásokat kell megcsinálni. Utána az updateInputXml-ben küldi el a módosításokat, majd erre válaszként megkapja az updateOutputXml fájlt. Itt sincs részletesebb hibakód, csak annyi, hogy nem tudta hozzáadni a kivételt.

A megoldás annyi volt, hogy fogtam, és a tűzfal is kapott egy “Restore defaults” lökést. Ezután a quickconfig gond nélkül lefutott, és engedélyezte ugyanazt a szabályt, ami eddig is be volt kapcsolva:-)

Subscription hiba megoldása

Az eseményforrások viszont továbbra se tudtak kapcsolódni, az ő naplójukban ez az üzenet volt:

The forwarder is having a problem communicating with subscription manager at address collector.ftslab.local.  Error code is 2150859027 and Error Message is <f:WSManFault xmlns:f=”http://schemas.microsoft.com/wbem/wsman/1/wsmanfault” Code=”2150859027″ Machine=”source.ftslab.local”><f:Message>The WinRM client sent a request to an HTTP server and got a response saying the requested HTTP URL was not available. This is usually returned by a HTTP server that does not support the WS-Management protocol. </f:Message></f:WSManFault>.

Ennek ellenére a forrás tudott a sima parancssori winrm klienssel csatlakozni. A Wireshark segített most is, mint sok más esetben, a háttérben ezt a kérést küldte a forrás:

POST /wsman/SubscriptionManager/WEC HTTP/1.1
Connection: Keep-Alive
Content-Type: application/soap+xml;charset=UTF-16
Authorization: Kerberos
User-Agent: Microsoft WinRM Client
Content-Length: 0
Host: collector.ftslab.local:5985

Ez a válasz jött rá:

HTTP/1.1 404
Server: Microsoft-HTTPAPI/2.0
Date: Thu, 11 Mar 2010 12:29:16 GMT
Connection: close
Content-Length: 0

Tehát tud kapcsolódni itt is, csak a /wsman/SubsciptionManager/WEC nincs meg. Úgyhogy irány vissza a központi gép, és lássuk, hogy van-e valami részletesebb hiba. Az eseménynaplójában egymás után közvetlenül a következő két üzenet szerepelt:

10149 The WinRM service is not listening for WS-Management requests.
10148 The WinRM service is listening for WS-Management requests.

?? Döntse már el, hogy most figyel, vagy nem figyel:-) A 10149 hiba leírása nem segített, ugyanis előtte már többször is ellenőriztem, hogy távolról el tudják érni a központi gépet, létezik is a listener, csak az Event forwarding nem találja. Végső elkeseredésemben teljes resetet nyomtam: központi gép újraindít, csoportházirend szabályok levéve, winrm gyári konfiguráció visszaállít:) Utána megcsináltam kézzel mindent, és most ment is rendesen. Most már csak a két, látszólag ugyanolyan beállítás közötti különbséget kellett megtalálni. Nézegettem egy darabig, amikor belém csapott, hogy a WinRM listener nem csak a szerver külső IP-jén nem figyel, hanem a loopback interfészen (127.0.0.1-es cím) sem! Nosza, a csoportházirendben a WinRM beállításoknál hozzáadtam ezt is az IPv4 szűrőhöz, és így már egyből ment minden. Arra kell még figyelni, hogy 15 percenként küldi csak tovább az eseményeket, a tesztelésnél ezt vegyük figyelembe.

Megoldás: tehát a megoldás csak annyi volt, hogy a csoportházirendben hagyni kell, hogy a loopback interfész IP címén is hallgatózzon a WinRM. 0x8033808F hiba megoldva.

KIEGÉSZÍTÉS: Tűzfalprobléma

Az események továbbítása ment egy ideig, aztán pár hét múlva megnéztem a tulajdonságait mégegyszer, és akkor már a következő hibát dobta (“The WinRM client could not create a push subscription…”):

Az előfizetés állapotát lekérdezve ezt kaptam:

A 0x802280AA hibakódra nem találtam semmit. A listenert nem piszkáltam azóta, és a többi gépről is be tudtam lépni WinRM-mel erre a gépre, úgyhogy először nem értettem a hibát.

A megoldás annyi volt csak, hogy ennek a szervernek több hálózati interfésze van, és a külső lábán a tűzfal beállításainál letiltottam a WinRM portját. Az Event Forwarding pedig nem veszi észre, hogy azon a lábon nincs is WinRM listener, így felesleges a tűzfalszabály meglétét ellenőriznie. A wecutil.exe segédprogramjában nem találtam ezzel kapcsolatban semmi beállítást. Úgyhogy egyelőre engedélyeztem újra a WinRM-et a külső lábon is (úgysincs ott listener).

ESX 3.5 menedzselése vCenter 4-en keresztül

Haladgat a vCenter 4-re átállás, a gépeinket szépen lassan frissítjük ESXi 4-re, és beállítjuk az új vCenter alá. Azonban sajnos van még egy-két régebbi szerverünk, amiben nincs 64 bites támogatás, így csak ESXi 3.5-öt tud futtatni. Elvileg tud a vCenter 3.5 és 4-es ESX-eket is vegyesen kezelni, úgyhogy gondoltuk, hozzáadjuk a régi gépeket is. Azonban egyből szólt, hogy ESX 3.5 menedzseléshez be kell állítani egy licenc szervert. Csináljuk meg akkor gyorsan, ez elvileg nem lehet olyan nehéz…

A vSphere 4 dokumentációi között van egy leírás, ami összefoglalja, hogy hogyan lehet 3.5-ös licenceket kezelni vCenter 4 alatt: License Server Configuration for vCenter Server 4.0. Mivel alapból nem kell licenc szerver a vSphere 4-es serialokhoz, ezért, ha 3.5-ös ESX-eink is vannak, akkor külön kell telepíteni a VMware License Servert. A leírás szerint ezt a VMware weboldaláról kell letölteni. Vagy fél óra keresés után kezdtem volna már feladni, amikor az egyik KB cikkben végre megleltem a linket, a VI3 Drivers & Tools oldalán kell keresni. A telepítő Next – Next – Finish, azonban a végén a következő hibaüzenetet adta:

Product: VMware License Server — Error 1920.Service VMware License Server (VMware License Server) failed to start. Verify that you have sufficient privileges to start system services.

Tartományi rendszergazdával voltam bejelentkezve, szóval ez elég furcsa lenne.. Az eseménynapló már egy kicsit pontosabb volt:

The VMware License Server service failed to start due to the following error:  The service did not respond to the start or control request in a timely fashion.

Hát ez nem túl segítőkész. Valami hálózati hibára gyanakodtam, úgyhogy Process Monitorral megnéztem, hogy mit csinál a szolgáltatás elinduláskor. Naplózott vagy 3000 eseményt, ezek közül egy hálózati kérés se volt. WinSock meg egyéb hálózattal kapcsolatos DLL-ekkel matatott sokat, de látszatra semmi komoly gond nem volt.

Végül itt találtam meg a megoldást: Error 1920 installing VMware Licensing Server on Windows 2008 x64. A weboldalon lévő License Server egy régi verzió, a VirtualCenter 2.5 U3 ISO-ban van egy frissebb, annak a verziója 2.5.0.64227 (a webről letölthetőé 64192). Ez hip-hop felment, a vSphere kliensből be kellett állítani a vCenter Server Settings / Licensing / License Server résznél a License Server elérését, és már hozzá is lehetett adni 3.5-ös ESX-eket. Grrr…

Windows Server frissítések széljegyzete

Januárban nagyszabású IT hadműveleteket ütemeztünk be, az elmúlt egy évben felgyűlt vagy egy hónapnyi munkát kéne másfél hétbe belezsúfolni:-) Egyelőre elég jól haladunk, pár nagyobb falaton már túlvagyunk (BladeCenter beüzemelés, szerverszoba újrakábelezés és dokumentálás, ESXi 4.0 frissítések, diszk cserék). Most a Windows szervereknek is nekiálltam, remélhetőleg végre megszabadulunk a Windows Server 2003-aktól:-).

Pár apróság, ami közben előjött:

WSUS migrálás: másik szerverre került át a WSUS, de az eddig letöltött frissítéseket és azok elfogadását jó lett volna megtartani. Itt van egy jó leírás, hogy hogyan lehet nekiállni: How to move WSUS 3.0 to a new server. A WsusMigrateImport eszköz a következőket mondta pár frissítésre, de egyébként jól lefutott: “Update ‘2ee4cbc6-236a-4750-a902-04b07727415b’ with revision 102 does not exist. Server is out-of-sync with the parent.” (a hibaüzenet jogos volt, közben még tényleg változtattam kicsit az eredeti szerveren, úgyhogy pár felesleges frissítés már nem került át). Utána már csak át kellett állítani a wsus DNS aliast, és várni, hogy a gépek már az új szerverhez csatlakozzanak és jelentsék az állapotukat.

Domain Admins vs. UAC vs. NTFS jogok: feltelepült szépen az egyik Windows Server 2008 R2, de rögtön előjött az UAC egy kellemetlen hatása. Az Administrator felhasználót nem használjuk, mindenkinek van egy saját admin felhasználója (Domain Admins csoport tagja). Viszont ha azzal lépek be, és meg akarok nézni egy olyan könyvtárat, aminél az ACL jogok direkt le vannak korlátozva az Administrators csoportra, akkor előjön az UAC prompt. Ez még nem is lenne rossz, de mivel az explorer.exe-t nem tudja teljes rendszergazda jogokkal futtatni, ezért helyette azt csinálná, hogy az adott felhasználót hozzáadja az ACL-ekhez. Ezzel a szép szerep alapú hozzáférési listákat el is rondítja:) Leírás a jelenségről részletesen pl. itt: NTFS Rights Issue with UAC, logged on with Domain Admin Account. Mivel erre a szerverre alapvetően nem jelentkezünk be, hanem távolról menedzseljük (Powershell 2, WinRM, Server Manager:), ezért fogtam, és az Admin Approval-t kikapcsoltam az összes admin felhasználóra. A megfelelő beállítást itt találjuk:

Local Security Policy / Local Policies / Security Options / User Account Control: Run all administrators in Admin Approval Mode kikapcsolása

Profil létrehozási hiba: az admin felhasználómnak nem gyártott új helyi profilt, hanem mindig ideiglenes profilt használt (a vándorló profilt kikapcsoltam, hisz mindegyik szerveren más és más alkalmazás volt fent, így más és más linkek kellettek a Taskbarra). Az eseménynaplóban a következő hibaüzenet volt gyanús: “Windows has backed up this user profile. Windows will automatically try to use the backup profile the next time this user logs on.”.  Rákeresbe ez a KB cikk segít a megoldásban: “Error message when you log on to a Windows Vista-based or Windows 7-based computer by using a temporary profile: “The User Profile Service failed the logon. User profile cannot be loaded”. Hát, lebuktam:-) Igen, kézzel letöröltem a régi vándorló profilom helyi változatát, Vista óta ezt viszont megjegyzi. A következő kulcs alól kell kitörölni:  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

Remote Desktop kliens alap beállításai: ezt mindig elfelejtem, úgyhogy ide is felírom:) Az adott felhasználó dokumentumok mappájában van egy default.rdp, abból szedi az mstsc.exe az aktuális beállításait. Én a disable wallpaper:i:0 és redirectprinters:i:0 értékeket állítottam át, a részletes lista megtalálható pl. itt: Remote Desktop Protocol settings in Windows Server 2003 and in Windows XP.

Most már “csak” az új tartományvezérlő beállítása, tárhelyek migrálása, egy switch csere, új komponensek mentésének megvalósítása, valamint az új hallgatók és tantárgyi weboldalak létrehozása van hátra. Úgy látszik, folytatódik az “Infrastruktúra hete” rendezvénysorozatunk:-)

Ubuntu 9.10 “Karmic” GTK+ bug

Amióta frissítettem az asztali Ubuntu rendszeremet megjelentek benne furcsa bugok, természetesen cserébe azokért a bugokért amik viszont kijavultak a release frissítés keretében. A munkát legjobban befolyásoló hiba az, hogy az Eclipse keretrendszerben bizonyos dialógusablakokban nem tudok a gombra kattintani, miközben a billentyűzetkombinációk működnek.

Kis utánajárással kiderült, hogy az új GTK-val van a probléma, azon belül is a “Client Side Windows” technológiával. Ennek keretében bizonyos SWT modulok módosultak amire az eclipse és hasonlóan a flash player még nincs felkészülve, ezért a mouseevent-ek kiszámíthatatlanul működnek. Flash esetén pl. nem megy a bal klikk bizonyos esetekben, de ha jobb klikkelek és nyomva tartom folyamatosan, akkor szépen működik a bal is.

Van rá megoldás, méghozzá a “Client Side Windows” technológia letiltása egy “export GDK_NATIVE_WINDOWS=1” hívással beállított környezeti változó segítségével. A flashplayer modulnak van is bash wrappere, abba úgy ahogy van be lehet injektálni és azonnal működik is a firefox újraindítása nélkül, az eclipse-hez pedig kell gyártani egyet.

Tömören erről szól az alábbi két bug, melyben írnak sok minden másról is, Compiz letiltása és hasonlók, de végső soron kijön, hogy a fent vázolt egyszerű megoldás eliminálja a problémát.

Eclipse 3.5-höz van már új Karmic csomag, ebben benne van az az SWT patch amivel helyesen működik, az eclipse-org-os forrásból származó dolgok esetén pedig wrapperes megoldás kell.

Eclipse: https://bugs.launchpad.net/ubuntu/+source/eclipse/+bug/443004
Flash: https://bugs.launchpad.net/ubuntu/+source/flashplugin-nonfree/+bug/410407

Linux bootolása hálózatról WDS segítségével

A Windows Deployment Servicest (WDS) sikerült egész jól belőnünk, a laborgépek újratelepítése simán megy vele most. Már csak egy dolog hiányzott: a WDS segítségével alapból csak WIM image-eket lehet hálózatról elindítani, nekünk pedig volt egy jó kis linuxos PXE szerverünk, mindenféle hasznos kis opcióval. Lehetett memtest-et, valami minimal Linuxot vagy akár ESXi-t is indítani róla. Eddig, ha valami kellett róla, akkor leállítottuk a WDS-t, így az nem nyomta el a DHCP-ben beállított 66-os opciót (Boot Server Host Name), és akkor a kliensek a pxelinux menüjét kapták meg. Ennél azért szerencsére van jobb megoldás is:)

Olyat nem találtam, hogy az egyik PXE szerver átdobja a kérést egy másiknak (mintha azt olvastam volna valahol, hogy ez ilyet nem is lehet), de azt be lehet állítani, hogy a WDS szerverre is felrakunk egy pxelinuxot, annak a menüje fogadja a klienseket, és ott egy opció a WDS eredeti boot menüjének megjelenítése. A végeredmény valami hasonló lesz:

wds-pxe-boot-4A következő lépéseket kell elvégezni ehhez:

1. Creating a PXE Boot menu for deploying Linux with Windows Deployment Services (WDS): ezt a leírást kell követni. Nagy vonalakban annyi, hogy át kell másolni a pxelinux boot programját és a menü megjelenítéséhez szükséges fájlokat, létre kell hozni a konfigurációs fájlját, fel kell másolni azokat a fájlokat, amiket a pxelinux segítéségével akarunk kiszolgálni, majd be kell állítani, hogy a pxelinux.com legyen az alapértelmezett boot program és ne a pxeboot.com.

2. Ez az utolsó lépés a trükkös: a Windows Server 2008 R2-ben lévő WDS-ben már nincs ilyen beállítás a szerver beállításainál a Boot fülön. Helyette ezt parancssorból kell megtenni:

wdsutil /set-server /bootprogram:boot\x86\pxelinux.com /architecture:x86
wdsutil /set-server /N12bootprogram:boot\x86\pxelinux.com /architecture:x86

Ezt utána meg kell csinálni x64-re is, ha vannak olyan klienseink is (a WDS alapértelmezésként automatikusan detektálja a kliens architektúráját, és az ennek megfelelő programot és menüt mutatja). Az N12bootprogram az a program, ami akkor indul el, amikor olyan üzemmódban van a szerver, hogy nem kell F12-et nyomni a hálózatról bootoláshoz a kliensen a WDS elindítása után (ez állítható a Boot fülön). További információ a wdsutil leírásában.

3. A fenti leírásból hiányzik, de ahhoz, hogy az AbortPXE opció működjön, a $WDSRoot\boot\$arch könyvtárban lévő abortpxe.com-ot is le kell másolni abortpxe.0 néven.

4. Én beállítottam a még a GParted Live image-et a fenti leírásnak megfelelően. Ott csak az működött, hogy http-vel szedi le a squashfs fájlt, tftp esetén Access Violation hibaüzenetet dobott. Valószínűleg az a gond, hogy az új WDS nem szereti a /-t csak a \-t (ebben a leírásban vannak egyébként jó ötletek WDS-es tftp hibakeresésre), azt meg a GParted-ben lévő tftp kliens nem ette meg.

Hálózati forgalom

Végezetül pár Wiresharkból, hogy mi is történik a háttérben.

– Kliens elindulása, DHCP üzenetek: a 10.40.1.1 a DHCP szerver nálunk, a 10.40.1.61 a WDS szerver. A DHCP Ack üzenetben adja át a kliensnek, hogy először a wdsnbp.com fájlt kell letöltenie (ez írja, hogy Press F12 for WDS boot), majd utána a pxelinux.com-ot szedi le.

wds-pxe-boot-1– pxelinux menü letöltése, majd WDS indítása: itt leszedi a menüt meg a pxelinux beállítását, majd a WDS opciót választottam. A pxelinux config fájljában az van, hogy ilyenkor a pxeboot.0-t indítsa (ami a pxeboot.n12 tulajdonképpen), az pedig utána elvégzi a WDS-es indulási folyamatot: bootmgr.exe letöltése, a WDS könyvtárában lévő BCD (Boot Configuration Database) betöltése, majd elkezdi betölteni a WIM fájlt.

wds-pxe-boot-3– Itt pedig az látszik, amikor a GParted-et választottam:

wds-pxe-boot-2

Most már csak át kell migrálni a régi pxelinux beállításait, és élvezhetjtük a WDS és a pxelinux előnyeit együtt:-)

Micskei Zoltán