Invent startpage set in IE for XP and Windows7 clients. Needs a list of computers and collects the startpage in a CSV file.
[cmdletbinding()]
Param(
$Computers,
$output,
$Progress,
[Switch]$Loop
)
$ErrorActionPreference = "SilentlyContinue"
If(Test-Path -Path $Computers -PathType Leaf){
[Array]$Script:computers = Get-Content $Computers
}
$ComputerCount = $Computers.Count
$Script:Database = @{}
Function Get-Startpage{
Param(
$output,
$Progress
)
if(Test-Path -Path $Progress -PathType Leaf){
[Array]$ProgressContent = Get-Content $Progress
}
Else{
Try{"DATE,Computer,Status" | Out-File $Progress
[Array]$ProgressContent = Get-Content $Progress
}
Catch{Write-Error $_;Break}
}
If(!(Test-Path -Path $output -PathType Leaf)){
Try{'SID,Computername,USER,Start Page' | Out-File $output}
Catch{Write-Error $_;Break}
}
Foreach($Client in $Script:Computers){
Try{
[Array]$status = $ProgressContent | Where-Object{ $_ -match "$Client"}
$Status = $status[-1].Split(",")[-1]
}
Catch{$status -eq $null}
Write-Host $Client
$Ping = new-object Net.NetworkInformation.Ping
If(($Ping.Send($Client).Status -eq "Success") -and (($status -eq "Failed") -or ($status -eq $null))){
$OperatingSystem = (([adsisearcher]"cn=$client").FindOne()).Properties.operatingsystem
Switch($OperatingSystem){
"Windows 7 Enterprise"{
Try{$Userprofile = Get-WmiObject -ComputerName $client win32_userprofile}
Catch{
Write-Host $Client
Write-Error $_
$Userprofile = $null
}
If($Userprofile){
$Userprofile | Where-Object {($_.localpath -match 'c*users') -and ($_.Loaded)} | Select SID | ForEach-Object{
$SID = $_.SID
$objSID = New-Object System.Security.Principal.SecurityIdentifier($SID)
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$Username = $objUser.Value.Split("\")[1]
$table = @{"USER" = $Username;"SID" = $SID; "Start Page" = "n/a"; "Computername" = "$Client"}
$currentUser = New-Object psobject -property $table
$Script:Database.$client += @{"$username" = $currentUser}
}
}
}
"Windows XP Professional"{
Try{$Userprofile = (Get-WmiObject -computername $Client -Query "Select UserName from Win32_ComputerSystem").UserName}
Catch{
Write-Host $Client
Write-Error $_
$Userprofile = $null
}
If($Userprofile){
$Domain = $Userprofile.Split("\")[0]
$Username = $Userprofile.Split("\")[1]
$objUser = New-Object System.Security.Principal.NTAccount($Domain, $Username)
$SID = ($objUser.Translate([System.Security.Principal.SecurityIdentifier])).Value
$table = @{"USER" = $Username;"SID" = $SID; "Start Page" = "n/a"; "Computername" = "$Client"}
$currentUser = New-Object psobject -property $table
$Script:Database.$client += @{"$username" = $currentUser}
}
}
"Default"{Break}
}
$Userdata = ($Script:Database.$Client | ForEach-Object {$_.Values})
Foreach($User in $Userdata){
Try{
$SID = $User.SID
$objSID = New-Object System.Security.Principal.SecurityIdentifier($SID)
$objUser = $objSID.Translate( [System.Security.Principal.NTAccount])
$Username = $objUser.Value.Split("\")[1]
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('USERS', $Client)
$regkey = $reg.OpenSubkey("$SID\\Software\\Microsoft\\Internet Explorer\\Main")
$StartPage = $regkey.GetValue("Start Page")
If($StartPage.GetType().Name -ne "String"){Throw "Value not String"}
$Script:Database.$Client.$Username.'Start Page' = $StartPage
}Catch{
Write-Host $Client
Write-Error $_
$Script:Database.$Client.$Username.'Start Page' = "Unknown"
}
}
Try{
$Script:Database | ForEach-Object{$_.$Client.Values} | ForEach-Object{
$SID = $_.SID
$Computername = $_.Computername
$User = $_.USER
$StartPage = $_.'Start Page'
"$SID,$Computername,$User,$StartPage"
} | Out-File $output -Append
}
Catch{Write-Host $Client;Write-Error $_;Break}
Try{
$TimeStamp = Get-Date -Format "yyyyMMdd:HH.mm.ss"
"$TimeStamp,$Client,Successful" | Out-File $Progress -Append
$Script:Database.Status += @{"$Client" = $True}
}
Catch{Write-Host $Client;Write-Error $_;Break}
}
ElseIf(($Status -eq "Successful") -or ($Status -eq "Skipped")){
#Do nothing. Already Successful.
$Script:Database.Status += @{"$Client" = $True}
}
Else{
Try{
$Script:Database.Status += @{"$Client" = $false}
$TimeStamp = Get-Date -Format "yyyyMMdd:HH.mm.ss"
"$TimeStamp,$Client,Failed" | Out-File $Progress -Append
}
Catch{Write-Host $Client;Write-Error $_}
}
$Script:Percentage = 100/$ComputerCount
$Script:Completed = ($Script:Database.Status.Values | Where-Object{$_ -Match $true}).Count
If(!$Script:Completed){$Script:Completed = 0}
$Script:currentpercentage = $Script:Percentage*$Script:Completed
write-progress -Activity "Collecting Startpage information." -ID 1 -Status "Processing $Client. Completed count: $Script:Completed/$Script:ComputerCount" -PercentComplete $Script:currentpercentage
}
}
[Void](Get-Startpage -output $Output -Progress $Progress)
If($Loop){
While(($Database.status.Values | Where-Object{$_ -Match $false}) -eq $false){
[Void](Get-Startpage -output $Output -Progress $Progress)
}
}
