Tags

Howto (51) Free Software (35) Powershell (33) Windows Server (23) AD (16) Hyper-V (16) Exchange (13) Office (13) Group Policy (10) Windows Server 2012 (9) Scripts (7) Symantec BE (5) Windows 8 (5) Cisco (4) TMG (4) Terminal Server (4) Cluster (3) HP (3) RDS (3) UAG (3) Citrix (2) DC (2) DNS (2) IE10 (2) OpenID (2) PKI (2) SCVMM (2) Windows Live (2) iLO (2) Backup (1) DPM (1) Fileserver (1) IE (1) SQL; DPM (1) Security (1) Sharepoint (1) Switch (1) VMWare (1) Veeam (1)

vrijdag 20 december 2013

Powershell Pipeline

Vier manieren voor pipeline input:

  1. ByValue (match op naam van object)
  2. ByProperty (match op naam van property)
  3. ByProperty maar waarbij de naam van de property niet overeenkomt met een van de mogelijkheden
  4. Indien CMDLet geen pipe-input kan hebben
Stel je wilt een overzicht hebben van de BITS service op alle computers in het domein.
 
Je voert dan een opdracht in die als eerste de gewenste computers ophaalt, zoals:
 
Get-ADComputer –Filter *
 
Daarna voer je deze door de pipeline heen naar Get-Service –name BITS:
 
Get-ADComputer –Filter * | Get-Service –name bits
 
Dit werkt echter niet omdat het object van byValue niet overeenkomt met het object ADComputer maar met ServiceController.
 
Als je get-member uitvoert voor get-service dan zie je dat het object ServiceController heet, welke wel in de help-file voorkomt als zijn ByValue mogelijkheid:
 
 
 
 
Er zal gekeken moeten worden of er een hookup is op basis van “ByPropertyname”:
In de helpfile staat dat ComputerName wel een input (true) optie is:
 
 
 
Echter als je bij de properties van Get-ADComputer kijkt zul je zien dat ComputerName geen property is van Get-ADComputer.
Wel “name”, je zal dus “name” moeten hernoemen naar “ComputerName” alvorens deze aan Get-Service mee te geven.
 
Get-ADComputer –Filter * | select –Property @{name=’ComputerName’; expression{$_.name}} | Get-Service –name bits
 
 
Het kan voorkomen dat een CMDLet geen pipe-input kan hebben.
Je kunt dat in de help-file van de desbetreffende CMDLet opzoeken.
Onder de parameters staat achter elke “Accept pipeline input?” false.
Tevens staat onder het kopje INPUT:
 
 
 
 
 
 
Get-WmiObject -Class win32_bios -ComputerName (Get-ADComputer -Filter * | Select -ExpandProperty name)
 
Of beter PSv3 stijl:
 
Get-WmiObject -Class win32_bios -ComputerName (Get-ADComputer -Filter * ).name
 
Of je gebruikt de vernieuwde versie van Get-WmiObject nl Get-CimInstance die wel pipeline input ondersteunt ;)
 
 
 

Wie zit er achter welke poort van welke switch

Als eerste installeer je een TFTP server (bijvb de gratis SolarWinds TFTP Server)
 
Vervolgens log je in op alle switches en exporteer je de gehele mac-address tabel naar een csv bestand:
 
copy command-output 'show mac-address' tftp <ip-adres van TFTP server> <bestandsnaam.csv>
 
 
Daarnaast voer je een netwerkscan uit met bijvoorbeeld de gratis Network Scanner Tool van Softperfect.
 
De scan exporteer je naar csv
 
In Excel verwijder je alle streepjes van de mac-addresses in beide export bestanden, zodat ze gelijk zijn.
 
Daarna een vertical lookup

Remove a specific endorsement from LinkedIn Profile

 Edit “Skills & Expertise”, click on “Manage Endorsements” and click on the proper endorsement.
Deselect the appropriate endorsement and click “save”.
 
 
 

Verwijder de voornaam of achternaam of een ander veld van een aantal gebruikers in AD

Onderstaand commando verwijderd de voornamen van alle gebruikers in de OU test:
 
Get-ADUser -Filter * -SearchBase "OU=test,DC=domein,DC=local" | Set-ADUser -GivenName $NULL
 

maandag 28 oktober 2013

SCVMM 2012 Error 12711

Na het afbreken van een backup in DPM ging een VM onderuit, deze VM startte daarna niet meer op, zie onderstaande foutmelding:
 
Error (12711)
VMM cannot complete the WMI operation on the server (hv01.domain.local) because of an error: [MSCluster_Resource.Name=&quot;SCVMM Naam-VM&quot;]
The requested operation can not be completed because a resource has locked status.
 
The requested operation can not be completed because a resource has locked status (0x1748)
 
Recommended Action
Resolve the issue and then try the operation again.
 
 
 
Oplossing:
 
 
Get-ClusterResource -Cluster clusternaam | where {$_.Name -like 'SCVMM *' -and $_.ResourceType -like '*Configuration'} | Update-ClusterVirtualMachineConfiguration
 
 
Daarna de VM een refresh gegeven in SCVMM en gestart.
 
 

Powershell XML input

 
 
Lees de xml in en plaats het in een variabele:
 
$xml = [xml](Get-Content .\r_and_j.xml)
$xml.PLAY
$xml.PLAY.ACT
 
 
 
$xml.PLAY.ACT.SCENE.SPEECH | group speaker | sort count
 
 
 

Powershell cmdlet function Begin-Process-End

BEGIN: Setting up code necessary to do your processing (pre-processing)
PROCESS: Does the processing
END: Cleaning up code (post-processing)
 
De code in PROCESS wordt altijd minimaal 1x uitgevoerd, dus plaats hier altijd je code in ook al gebruik je de pipeline input niet. Mocht je later toch pipeline input wensen dan staat de code iig op de juiste plaats.
 
Voorbeeld:
Het kan voorkomen dat je eerst een verbinding moet maken met een SQL database alvorens je de input gaat processen.
Nadat alles geprocessed is kan er opgeruimd worden.
 
 
Voorbeeld 1:
 
 
 
Voorbeeld 2:
 
 
Zie ook:
 
 
 

Achterhalen of een bestand is gedownload of zelf is gemaakt

Als je een bestand met Internet Explorer download, slaat deze zone informatie op  in een ADS (Alternate Data Stream).
 
Voorheen kon je ADS alleen bekijken met speciale tooltjes, vanaf Windows 8 / 2012 is dat ook mogelijk met Powershell.
 
Hieronder zie je dat in de map c:\test een viertal bestanden staan, twee daarvan zijn gedownload en twee ervan zijn zelf gemaakt. Met dit of get-item kun je niet zien welke gedownload zijn en welke niet. Dat komt omdat deze informatie in een ADS zit opgeslagen.
 
Je kunt met het volgende commando achterhalen welke bestanden gedownload zijn:
 
Get-Item -Path * -Stream *  | where {$_.Stream -eq "Zone.Identifier"} | ft filename,stream,length -a
 
Je kunt daarna achterhalen met welk ZoneId het bestand is gedownload:
 
Get-Content -Path .\download1.zip -Stream Zone.Identifier
 
Hieronder kun je zien dat ZoneId =3 betekent dat het bestand van Internet afkomstig is:
 
Value Setting
------------------------------
0     My Computer
1     Local Intranet Zone
2     Trusted sites Zone
3     Internet Zone
4     Restricted Sites Zone
 
Het is overigens mogelijk om bestanden in een ADS te zetten van een ander bestand.
Hieronder zie je dat ik het programma notepad.exe in de ADS van bestand lokaalgemaakt1.txt plaats:
 
 
Met powershell kun je de stream bekijken:
 
Get-Item -Path * -Stream *  | ft filename,stream,length -a
 
 
Waarbij het vroeger mogelijk was om met commando “start bestandsnaam:adsbestand” het programma te openen is dat in Windows 8 iig niet meer mogelijk:
 
 
Je kunt de ADS weghalen door onderstaande commando’s uit te voeren:
 
C:\Test>type lokaalgemaakt1.txt > lokaalgemaakt1.bak
C:\Test>del lokaalgemaakt1.txt
C:\Test>ren lokaalgemaakt1.bak lokaalgemaakt1.txt
 
Als je daarna weer in PS naar de streams bekijkt zie je dat deze verdwenen is:
 
Get-Item -Path * -Stream *  | ft filename,stream,length -a
 

maandag 21 oktober 2013

Powershell snapshot van processen / services op server en deze vergelijken met de huidige processen

Het kan handig zijn om een overzicht te hebben van de processen op je servers en deze zo nu en dan te vergelijken met de huidige draaiende processen.
Dit om afwijkingen (bijvoorbeeld Malware) te kunnen constateren.
 
Maak een baseline / snapshot / referenceobject van de draaiende processen:
 
Get-Process | Export-Clixml -Path .\ro-processes.xml
 
Vergelijk deze vervolgens met de huidig draaiende processen:
 
Compare-Object -ReferenceObject (Import-Clixml .\ro-processes.xml) -DifferenceObject (Get-Process) -Property name
 
 
 
De SideIndicator geeft met het pijltje aan of er een  process is bijgekomen of afgegaan.
 
Je kunt dit natuurlijk ook doen met services en dit schedulen zodat eventuele wijzigingen per mail oid binnen komen.
 

Check Powershell Version

Je kunt op een paar manieren erachter komen welke Powershell versie je hebt draaien.
 
Via Registry:
 
HKLM\SOFTWARE\Microsoft\Powershell\3\PowershellEngine
 
Via Powershell:
 
Get-Host
 
Of nog beter gebruik de built-in variable:
 
$PSVersionTable
 
 

Remote Powershell informatie

Remote Powershell kun je gebruiken door op de target-computer het commando: “Enable-PSRemoting –Force” te gebruiken.
Hiermee wordt WinRM geconfigureerd en er worden tevens firewall uitzonderingen gemaakt.
 
De listeners van WinRM staan standaard open op alle interfaces/ip adressen en luisteren naar 5985 (http) en 5986 (https).
 
Zie ook:
 
 
Voer: “winrm help config” uit om meer informatie betreft het configureren van WinRM.
 
Hierin staat oa:
 
Voorbeeld: een bepaalde listener uitschakelen
  winrm set winrm/config/listener?Address=IP:1.2.3.4+Transport=HTTP @{Enabled="false"}
 
en ook (geruststellend) :
 
Opmerking: bij HTTP-verkeer zijn standaard alleen berichten toegestaan die zijn versleuteld met de SSP Negotiate of Kerberos
 
Door onderstaande commando's uit te voeren kun je ervoor zorgen dat Powershell Remoting de poorten 80 (HTTP) en 443 (HTTPS) gebruikt:
 
Set-Item WSMan:\localhost\Service\EnableCompatibilityHttpListener -Value true
Set-Item WSMan:\localhost\Service\EnableCompatibilityHttpsListener -Value true
 
Je kunt powershell zo instellen dat deze een andere gewenste poort gebruikt:
 
Set-Item wsman:\localhost\listener\listener*\port –value <Port>
 
In de code moet je dan opgeven dat je over de ingestelde poort wilt verbinden:
 
New-PSSession –ComputerName <Netbios> -Port <Port>
Enter-PSSession –ComputerName <Netbios> -Port <Port>
Invoke-Command –ComputerName <Netbios> -Port <Port>
 
 
TrustedHosts toevoegen aan WinRM omdat de computer niet lid is van het(zelfde) domein:
 
 
Voer onderstaand commando uit:
 
winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'
 
 
 
Wil je dat Powershell alleen over HTTPS communiceert, dan vindt je hier meer informatie:
 
Configuring WINRM for HTTPS: http://support.microsoft.com/kb/2019527
 
Handig is het natuurlijk wel als je centraal kunt regelen dat je naar alle servers een Remote Powershell sessie kunt opstarten: Hier een blog over hoe je Remote PS enabled via een GPO:
 
 
 

Powershell Remarks Get-Help cannot find the Help files for this cmdlet on this computer

Als eerste moet je vanaf de plek waar je met Powershell aan de gang gaat eerst even de help updaten met de laatste versie:
(de helpfiles nemen redelijk wat ruimte in beslag, voer deze actie daarom niet uit op servers waar je de help niet nodig hebt)

PS C:\>Update-Help -Force
 
Nadat de help was bijgewerkt wilde ik de detailed help bekijken van de get-service cmdlet:
 
 
Het viel mij op dat er bij de parameters geen uitleg wordt gegeven betreft de parameter in kwestie.
 
Onderin bij Remarks staat dan ook de regel:
 
“Get-Help cannot find the Help files for this cmdlet on this computer. It is displaying only partial help.”
 
Het blijkt dat de oorzaak mijn nederlands talige Windows 8 computer is.
 
Door de –UICulture en-US mee te geven krijg ik wel alle detailed help te zien:
 
PS C:\> Update-Help -Module * -UICulture en-US –Force
 
 

Beheer Windows 2003 server met Powershell

Je kunt op een Windows 2003 server powershell v2 installeren, dmv de volgende download:
 
Windows Management Framework Core package (Windows PowerShell 2.0 and WinRM 2.0):
 
 
De services: Windows Management Instrumentation en Windows Remote Management moeten gestart zijn:
 
 
Vervolgens moet je remote sessions toestaan door in Powershell het commando: “Enable-PSRemoting” uit te voeren:
 
 
Nu kun je vanaf een andere computer een remote sessie opstarten met de Windows 2003 server:
 
Vanaf een andere computer kun je het Powershell commando: Enter-psSession MachineName uitvoeren.
 
Alle commando’s die je nu uitvoert zullen uitgevoerd worden op de Windows 2003 server waar je verbinding mee hebt gemaakt.
 
Om de sessie af te sluiten: Exit-psSession
 
 
 
 
Het is niet mogelijk om op een Windows 2003 Domain Controller, Active Directory met powershell te beheren.
Wel is het mogelijk om deze Active Directory te beheren met een Windows 7 (of Windows 2008 R2 Server) systeem.
 
Daarvoor moet je op de Windows 2003 Domain Controller de “Active Directory Management Gateway Service” installeren, deze is te downloaden: http://www.microsoft.com/en-us/download/details.aspx?id=2852
 
Deze download heeft een drietal prerequisites:
 
1. .NET Framework 3.5 SP1 moet geinstalleerd zijn
2. A hotfix rollup package for Active Directory Web Service is available for the .NET Framework 3.5 SP1: http://support.microsoft.com/kb/969166
3. Windows 7 clients cannot locate the Active Directory Management Gateway service that is installed on Windows Server 2003-based domain controllers: http://support.microsoft.com/kb/969429
 
 
 
 
 

Zoek een bestand met een bepaalde tekst mbv Powershell

Je kunt met Powershell een bestand zoeken welke een bepaald stuk tekst bevat:
 
get-childitem c:\users\ -filter *.txt -recurse | select-string -list -pattern "iets van tekst" | foreach {$_.Path}

maandag 14 oktober 2013

Outlook melding: "Deze bewerking is geannuleerd vanwege systeembeperkingen" bij aanklikken van een link

In Outlook 2010 kreeg ik de elke keer bij het aanklikken van een link, de melding:  “Deze bewerking is geannuleerd vanwege systeembeperkingen”.
 
Zie:
 
 
Tevens gaf Internet Explorer bij het opstarten de melding of deze als standaard ingesteld moest worden.
 
Het instellen van IE als standaardbrowser in IE zelf loste het probleem niet op.
 
 
Ook het uitvoeren van de fix op onderstaand blog, loste het probleem niet op:
 
 
De oplossing was eigenlijk nog eenvoudiger.
In het configuratiescherm onder standaardprogramma’s bij “Programmatoegang en standaardprogramma’s instellen” moet je Internet Explorer als standaardwebbrowser instellen:
 
 
 

DNS registration and Netbios Disablen on Windows Core

 
 
 
 
 
 
 
wmic nicconfig get caption,index,TcpipNetbiosoptions
 
wmic nicconfig where index=28 call SetTcpipNetbios 2
 
 
 
 
 

Manage Failover Cluster when cluster has been build with SCVMM

Je kunt het cluster beheren door de “Remote Server Administration Tools” te installeren:
 
 
 
 
 
 

Convert jpg / png to ico with paint

Je kunt met MS Paint jpg, png of andere bestandsformaten omzetten naar ico formaat.
 
Resize het betreffende plaatje in paint naar 16 x 16 pixels en sla deze op als 24-bit bmp bestand.
 
Deze bmp kun je vervolgens hernoemen naar ico.

maandag 30 september 2013

Installatie Exchange 2010 SP3 in hybrid omgeving

In het kort de volgende stappen uitgevoerd op de Exchange servers uitgevoerd:
  • SP3 geinstalleerd op Mailbox server
  • SP3 geinstalleerd op CAS/HUB
  • SP3 geinstalleerd op EDGE
  • OWA web.config files nagelopen op wijzigingen
  • IIS Default Web Site aangepast (SSL / redirection)
  • Casredirect.aspx aangepast ivm Hybrid omgeving url
 
Voor de OWA op de “Default Web Site” redirection aangezet en require SSL uitgevinkt, dir zodat “http://fqdn” redirect wordt naar “https://fqdn/owa
 
Omdat de redirection doorgegeven wordt naar de onderliggende Virtual Directories, deze daar weer uit moeten zetten met:
 
C:\Windows\System32\inetsrv>
appcmd set config "Default Web Site/autodiscover" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/ecp" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/ews" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/owa" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/oab" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/powershell" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/rpc" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/rpcwithcert" /section:httpredirect /enabled:false -commit:apphost
appcmd set config "Default Web Site/Microsoft-Server-ActiveSync" /section:httpredirect /enabled:false -commit:apphost
 
Dit geeft het volgende resultaat:
 
 
Meer info:
 
 
 
Office365 hybrid omgeving tuning:
 
Ivm onze hybrid Exchange omgeving zijn de volgende regels toegevoegd aan bestand “C:\Program Files\Microsoft\Exchange Server\V14\ClientAccess\Owa\casredirect.aspx”:
 
<%
if (RedirectionUrl.Contains("https://outlook.com/owa")) {
Response.Redirect(RedirectionUrl);
Response.End();
}
%>
 
Dit zodat alle gebruikers dezelfde url kunnen gebruiken en geredirect worden naar outlook.com indien nodig.
 
 

donderdag 26 september 2013

PowerShell for Failover Clustering: CSV Free Disk Space

De vrije ruimte van een CSV kun je met het powershell commando get-clustersharedvolume bekijken.
 
 
Dit is echter een nested object en kan worden weergegeven met de format-custom attribute:
 
 
De vrije ruimte zit in nested object SharedVolumeInfo\Partition en wordt in bytes weergegeven.
 
Met onderstaand script kun je een overzicht van de CSVs krijgen:
 
Get-ClusterSharedVolume | select -Expand SharedVolumeInfo | select -Expand Partition | ft -auto Name,@{ Label = "Size(GB)" ; Expression = { "{0:N2}" -f ($_.Size/1024/1024/1024) } },@{ Label = "FreeSpace(GB)" ; Expression = { "{0:N2}" -f ($_.FreeSpace/1024/1024/1024) } },@{ Label= "UsedSpace(GB)" ; Expression = { "{0:N2}" -f ($_.UsedSpace/1024/1024/1024) } },@{ Label = "PercentFree" ; Expression = { "{0:N2}" -f ($_.PercentFree) } }
 
 
 
Met onderstaand script worden de Volume namen omgezet in FriendlyVolumeName.
 
Import-Module FailoverClusters
 
$objs = @()
 
$csvs = Get-ClusterSharedVolume
foreach ( $csv in $csvs )
{
   $csvinfos = $csv | select -Property Name -ExpandProperty SharedVolumeInfo
   foreach ( $csvinfo in $csvinfos )
  {
      $obj = New-Object PSObject -Property @{
         Name        = $csv.Name
         Path        = $csvinfo.FriendlyVolumeName
         Size        = $csvinfo.Partition.Size
         FreeSpace   = $csvinfo.Partition.FreeSpace
         UsedSpace   = $csvinfo.Partition.UsedSpace
         PercentFree = $csvinfo.Partition.PercentFree
      }
      $objs += $obj
   }
}
 
$objs | ft -auto Name,Path,@{ Label = "Size(GB)" ; Expression = { "{0:N2}" -f ($_.Size/1024/1024/1024) } },@{ Label = "FreeSpace(GB)" ; Expression = { "{0:N2}" -f ($_.FreeSpace/1024/1024/1024) } },@{ Label = "UsedSpace(GB)" ; Expression = { "{0:N2}" -f ($_.UsedSpace/1024/1024/1024) } },@{ Label = "PercentFree" ; Expression = { "{0:N2}" -f ($_.PercentFree) } }
 
 
 
Natuurlijk willen we dit op afstand kunnen uitvoeren, hiervoor moet Powershell remoting enabled worden:
 
How to enable Powershell remoting:
 
Run Enable-PSRemoting, this will perform serveral tasks:
  • Start (or restart, if it’s already started) the WinRM service.
  • Set the WinRM service to start automatically from now on.
  • Create a WinRM listener for HTTP traffic on port 5985 for all local IP addresses.
  • Create a Windows Firewall exception for the WinRM listener. Note that this will fail on client versions of Windows if any network cards are configured to have a type of “Public,” because the firewall will refuse to create new exceptions on those cards. If this happens, change the network card’s type to something else (like “Work” or “Private,” as appropriate), and run Enable-PSRemoting again. Alternately, if you know you have some Public network cards, add the –SkipNetworkProfileCheck parameter to Enable-PSRemoting. Doing so will successfully create a firewall exception that allows incoming Remoting traffic only from the computer’s local subnet.
 
 

Active Directory attribute properties

Elk attribuut in de AD heeft bepaalde eigenschappen.
 
Handig om te weten. Hier een paar voorbeelden:
 
SAM-Account-Name Attribute:
 
 
CN                      : SAM-Account-Name
Ldap-Display-Name       : sAMAccountName
Size                    : Less than 20 characters.
Update Privilege        : Domain administrator
Update Frequency        : This value should be assigned when the account record is created, and should not change.
Attribute-Id            : 1.2.840.113556.1.4.221
System-Id-Guid          : 3e0abfd0-126a-11d0-a060-00aa006c33ed
Syntax                  : String(Unicode) 
 
User-Principal-Name Attribute:
 
 
CN                : User-Principal-Name
Ldap-Display-Name : userPrincipalName
Size              : -
Update Privilege  : Domain administrator or account owner.
Update Frequency  : In theory this should never change.
Attribute-Id      : 1.2.840.113556.1.4.656
System-Id-Guid    : 28630ebb-41d5-11d1-a9c1-0000f80367c1
Syntax            : String(Unicode) 
 
De overige kun je vinden op:
 
 
 
 

dinsdag 10 september 2013

Excel kolommen zijn cijfers ipv letters

Dit is aan te passen door bij “Opties voor Excel” naar “Formules” te gaan en daar het “Verwijzingstype R1K1” vinkje weghalen.
 

Change groupscope van Global naar DomainLocal

Je kunt de GroupScope niet rechtstreeks wijzigen van Global naar DomainLocal, je zal daarom eerst de scope moeten omzetten naar Universal <2>.
 
<<<< VOOR DEGENE DIE ZICH AFVRAAGT WAAROM >>>>
The reasons are largely historical.  In NT 4.0 domains, you had global groups and local groups and could not convert between the two.  When Active Directory was introduced with Windows 2000, this mechanism was held since NT 4.0 BDCs (Backup Domain Controllers) could exist in an AD domain when the domain was in either Windows 2000 Mixed Mode and later Windows 2003 Interim Mode.  Universal groups could not exist when the AD domain was in either of these modes because NT 4.0 BDCs could not interpret them.  When moved to 2000 Native Mode or higher, Universal groups and Distribution groups could be used in the AD domain.  Because of the design of the AD Schema, it became possible to convert Global or Local groups to Universal groups, and the other way around (provided the pre-requisites are met).
 
If you examine the attributes of the different types of Security groups, some of the reasoning becomes a bit more clear:
Global
groupType = 0x80000002 (ACCOUNT_GROUP | SECURITY_ENABLED)
sAMAccountType = 268435456 (GROUP_OBJECT)
 
Local
groupType = 0x80000004 (RESOURCE_GROUP | SECURITY_ENABLED)
sAMAccountType = 536870912 (ALIAS_OBJECT)
 
Universal
groupType = 0x80000008 (UNIVERSAL_GROUP | SECURITY_ENABLED)
sAMAccountType = 268435456 (GROUP_OBJECT)
 
That said, Microsoft has long recommended using the ADGLP model for RBAC in AD environments.  E.g., you place users in Global Groups, place Global Groups in Domain Local Groups, and assign permissions on objects to those Domain Local groups.  This makes sense if you examine the above attributes (Global - ACCOUNT_GROUP and GROUP_OBJECT, Local - RESOURCE_GROUP and ALIAS_OBJECT).  Some feel this security model is aging and true RBAC methods should be adopted but we aren't quite there yet in my opinion (Server 2012 is a step closer).  Anyway, the point is that if you find yourself converting groups in Active Directory, you probably have a design flaw in your group architecture.  I personally do not recommend converting between group types unless absolutely necessary.  In general, you should implement the groups correctly, migrate users and resources to the new group design, and destroy the old groups.
<<<< EINDE WAAROM >>>>
 
Je kunt die actie natuurlijk via de GUI doen (één-voor-één) of je gebruikt powershell (gebruik filter,searchbase en where om de scope te bepalen):
 
De tussenstap - van Global naar Universal:
 
PS C:\> Get-ADGroup -Filter "name -like 'LG_M_*'" -SearchBase "OU=Groups,DC=DOMAIN,DC=LOCAL" | where {$_.GroupScope -like "Global"} | Set-ADGroup -GroupScope Universal
 
Van Universal naar DomainLocal:
 
PS C:\> Get-ADGroup -Filter "name -like 'LG_M_*'" -SearchBase "OU=Groups,DC=DOMAIN,DC=LOCAL" | where {$_.GroupScope -like "Universal"} | Set-ADGroup -GroupScope DomainLocal
 
 

Achterhalen welke gebruiker achter een SID zit

Voer onderstaand powershell script gegeven:
 
 
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-21-1960401961-583907252-1417001413-2304")
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$objUser.Value
 
 

woensdag 4 september 2013

Get-Diskfree

Met onderstaand script kun je de schijfruimte van een computer bekijken die is toegewezen en welke vrij is:
Tevens kun je met een scriptje de LOW DISK SPACE van alle servers bekijken.
 
 
function Get-DiskFree
{
     [CmdletBinding()]
     param
     (
         [Parameter(ValueFromPipeline=$true,
                    ValueFromPipelineByPropertyName=$true)]
         [Alias('hostname')]
         [Alias('cn')]
         [string[]]$ComputerName = $env:COMPUTERNAME,
         [switch]$Format
     )
 
     BEGIN
     {
         function Format-HumanReadable
         {
             param ($size)
             switch ($size)
             {
                 {$_ -ge 1PB}{"{0:#.#'P'}" -f ($size / 1PB); break}
                 {$_ -ge 1TB}{"{0:#.#'T'}" -f ($size / 1TB); break}
                 {$_ -ge 1GB}{"{0:#.#'G'}" -f ($size / 1GB); break}
                 {$_ -ge 1MB}{"{0:#.#'M'}" -f ($size / 1MB); break}
                 {$_ -ge 1KB}{"{0:#'K'}" -f ($size / 1KB); break}
                 default {"{0}" -f ($size) + "B"}
             }
         }
 
         $wmiq = 'SELECT * FROM Win32_LogicalDisk WHERE Size != Null
                 AND DriveType >= 2'
     }
 
     PROCESS
     {
         foreach ($computer in $ComputerName)
         {
             try
             {
                $disks = Get-WmiObject -Query $wmiq `
                          -ComputerName $computer -ErrorAction Stop
 
                 if ($Format)
                 {
                     # Create array for $disk objects and then add each 
                    $diskarray = @()
                     $disks | ForEach-Object { $diskarray += $_ }
 
                     # The output of the computer name allows for 
                    # cleaner separation when querying multiple computers
                    Write-Output "Computer: $computer"
 
                     # Output custom formatted table
                    $diskarray | Format-Table -AutoSize `
                         @{n='Vol';e={$_.DeviceID}},
                         @{n='Size';e={Format-HumanReadable `
                         $_.Size};Align='Right'},
                         @{n='Used';e={Format-HumanReadable `
                         (($_.Size)-($_.FreeSpace))};Align='Right'},
                         @{n='Avail';e={Format-HumanReadable `
                         $_.FreeSpace};Align='Right'},
                         @{n='Use%';e={"{0:#}" -f ((($_.Size)-($_.FreeSpace))`
                         /($_.Size) * 100)};Align='Right'},@{n=' FS '`
                         ;e={$_.FileSystem};Align='Center'},
                         @{n='Type';e={$_.Description};Align='Left'}
                 }
                 else
                 {
                     foreach ($disk in $disks)
                     {
                         # Create property hash table
                        $diskprops = @{'Volume'=$disk.DeviceID;
                                     'Size'=$disk.Size;
                                     'Used'=($disk.Size - $disk.FreeSpace);
                                     'Available'=$disk.FreeSpace;
                                     'FileSystem'=$disk.FileSystem;
                                     'Type'=$disk.Description
                                     'Computer'=$disk.SystemName;}
 
                         # Create custom PS object and apply type
                        $diskobj = New-Object -TypeName PSObject `
                                     -Property $diskprops
                         $diskobj.PSObject.TypeNames.Insert(0,'BN.DiskFree')
 
                         Write-Output $diskobj
                     }
                 }
             }
             catch
             {
                 # Check for common DCOM errors and display "friendly" output
                switch ($_)
                 {
                     { $_.Exception.ErrorCode -eq 0x800706ba } `
                         { $err = 'Unavailable (Host Offline or Firewall)';
                             break; }
                     { $_.CategoryInfo.Reason -eq 'UnauthorizedAccessException' } `
                         { $err = 'Access denied (Check User Permissions)';
                             break; }
                     default { $err = $_.Exception.Message }
                 }
                 Write-Warning "$computer - $err"
             }
         }
     }
 
     END {}
 
 
 
 
PS C:\PSScripts>’localhost’, ‘computer’ | Get-DiskFree -Format
 
 
>>> LOW DISK SPACE <<<
 
> IPMO AD <
 
PS C:\PSScripts>Import-Module ActiveDirectory
 
> MAAK ARRAY <
 
PS C:\PSScripts>$servers = Get-AdComputer -Filter { OperatingSystem -like '*server*' } | select -expand name
 
> BEKIJK ARRAY <
 
PS C:\PSScripts>Write-Output $servers
 
PS C:\PSScripts>Get-DiskFree -cn $servers | ? { ($_.Volume -eq 'C:') -and ($_.Available / $_.Size) -lt .20 } | select comp*
 
 
PS C:\PSScripts>$servers | get-diskfree -Format
 
 
> LEEG ARRAY <
 
PS C:\PSScripts>$servers.Clear()