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)

dinsdag 10 september 2013

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()
 
 
 

Exchange Distribution Group Warning: "the object must be upgraded to the current Exchange version"

When you make a change to an Exchange Distribution Group and you get a Warning message like: "the object must be upgraded to the current Exchange version", you can click yes to upgrade.
But having hundreds of those groups you might want to upgrade de Exchangeversion of a Distribution Group through Powershell.
 
Warning:
 
 
 
To get an overview of the Distribution Groups with their version:
 
Get-DistributionGroup | sort exchangeversion | ft name,exchangeversion –a
 
To upgrade from a particular version to the current version:
 
Get-DistributionGroup | where {$_.Exchangeversion -like "0.1 *"} | Set-DistributionGroup
 
 

DNS server doesn't resolve TLD names

 
 
The server uses only root hints to resolve dns records.
 
Using nslookup for troubleshooting we found out that it was a dns problem.
 
 
 Clearing the cache resolved the problem
 
 

dinsdag 2 juli 2013

AD gebruikers aanmaken aan de hand van een CSV bestand en een Powershell script

Stappen:

  1. Pas het Excel bestand aan en sla deze op als CSV
  2. Converteer CSV bestand naar UTF8 formaat
  3. Gebruik Powershell script om de gebruikers aan te maken
  

Stap 1:

 
In de eerste regel van Excel staan de kolomnamen die ook in het Powershell script terug komen.
De Excel sheet heb ik enigszins moeten aanpassen zodat er kolommen ontstonden met bijvoorbeeld: gebruikersnaam  conventie (voorletter.geboortenaam) en DisplayName
 
Hier de door mij gebruikte eerste Excel rij:
 
PERSONEELSNUMMER;GivenName;1ste_letter_GN;Gebruikersnaam_tussenvoegsel;Geboorte_SN;Gebruikersnaam_met_spaties;Gebruikersnaam;UPN_Suffix;UPN;Title;Mobiel;Afdeling;Locatie;Preffered_SN;Space;DisplayName;EMAILADRES;Password
 
In onderstaand blog kun je zien hoe je een random wachtwoord kunt genereren:
 
 

Stap 2:

 
Het Powershell script maakt gebruik van het import-csv commando, echter importeert deze de csv in ASCII formaat.
Dat kan onderstaand resultaat opleveren:
 
 
Het CSV bestand zal daarom eerst geconverteerd moeten worden naar UTF8 formaat.
Dat kan gelukkig makkelijk doordat het Get-Content (cat) commando bestanden uitleest in UTF8 formaat.
 
Hierdoor hoef je alleen de output weg te schrijven naar een nieuw csv bestand, dat dan in UTF8 formaat is.
 
PS C:\SCRIPTS\CADU>cat NewUsers.csv > NewUsers2.csv
 
 

Stap 3:

 
Gebruik CreateADUsers.ps1 en pas deze eventueel aan:
 
 
# CreateADUsers.ps1
Set-ExecutionPolicy Unrestricted
Import-Module ActiveDirectory

 $csvpath = "c:\Scripts\CADU\NewUsers.csv"
$date = Get-Date
$logfile = "c:\Scripts\CADU\create_AD_users.log"
$Bedrijf = "TBedrijf"
$i=0
 
 # Specify parent container for all new users.
$OU =  "OU=Users,OU=TBedrijf,DC=test,DC=local"

 Import-Csv $csvpath -Delimiter:";" |  ForEach-Object {
$sam = $_.Gebruikersnaam
     Try   { $exists = Get-ADUser -LDAPFilter "(sAMAccountName=$sam)" }
     Catch { }
     If(!$exists)
     {
     $Password = $_.Password
New-ADUser $sam -GivenName $_.GivenName -Surname $_.Preffered_SN -DisplayName $_.DisplayName -Company $Bedrijf -Department $_.Afdeling -Mobilephone $_.Mobiel -Title $_.Title -Office $_.Locatie -EmailAddress $_.EmailAdres -UserPrincipalName $_.UPN -passthru |
ForEach-Object {
$_ | Set-ADAccountPassword -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $Password -Force)
$_ | Enable-ADAccount }

 # Set an ExtensionAttribute
       $dn  = (Get-ADUser $sam).DistinguishedName
       $ext = [ADSI]"LDAP://$dn"
       $ext.SetInfo()
       Move-ADObject -Identity $dn -TargetPath $OU

       $newdn = (Get-ADUser $sam).DistinguishedName
       Rename-ADObject -Identity $newdn -NewName $_.DisplayName

       $output  = $date.ToString() + " CREATED - Naam: " + $_.DisplayName + " (login: "
       $output += $_.UPN + " / " + $_.Password + ")"
       $output | Out-File $logfile -append
      }
      Else
      {
       $output  = $date.ToString() + " SKIPPED - Naam: " + $_.DisplayName + " (inlognaam: "
       $output += $_.UPN + ")"
       $output | Out-File $logfile -append
}
"----------------------------------------" + "`n" | Out-File $logfile -append
}
 
 
Persoonlijk vind ik het makkelijk om Powershell ISE in Administrative mode op te starten en het script in te laden.
 
 
 
 
 
 

Unsupported VM Configuration SCVMM 2012 (error 13932)

In SCVMM de melding van een Unsupported VM Configuration: oorzaak error 13932: “register the share to the cluster”.
 
 
 
Error (13932)
The file \\SCVMM01.test.Local\MSSCVMMLibrary\ISO\SW_DVD5_11.ISO is in a share which is not registered to the cluster TS-HQ-CL01.testLocal.
 
Recommended Action
Register the share to the cluster, and then try the operation again.
 
Om de foutmelding weg te krijgen, in Hyper-V manager de ISO loskoppelen:
 
 

Irfanview batch conversie van jpg bestanden

JPG bestanden kunnen een enorme hoeveelheid opslagcapaciteit opslokken.
Zowel de Megapixels als het aantal foto’s die gebruikers nemen, neemt alleen maar toe.
 
Ik gebruik Irfanview al jaren om af en toe alle JPG bestanden op de fileserver te verkleinen.
 
Test eerst de instellingen op een test map, alvorens je alle JPG bestanden op de hele file server aanpakt. De instellingen kunnen namelijk ook per versie van Irfanview wel eens verschillen.
 
Irfanview batch conversie (minimale versie 4.23!!!)
 
 
Advanced options:
 
 
Met Treesize van Jam-software kun je precies zien hoeveel opslagcapaciteit de jpg bestanden innemen.