403 lines
15 KiB
PowerShell
403 lines
15 KiB
PowerShell
#***************************************** Part to fill ***************************************************
|
|
# Log analytics part
|
|
$CustomerId = ""
|
|
$SharedKey = ''
|
|
$LogType = "DiskSize"
|
|
$TimeStampField = ""
|
|
#***********************************************************************************************************
|
|
|
|
# Log analytics functions
|
|
Function Build-Signature ($customerId, $sharedKey, $date, $contentLength, $method, $contentType, $resource)
|
|
{
|
|
$xHeaders = "x-ms-date:" + $date
|
|
$stringToHash = $method + "`n" + $contentLength + "`n" + $contentType + "`n" + $xHeaders + "`n" + $resource
|
|
|
|
$bytesToHash = [Text.Encoding]::UTF8.GetBytes($stringToHash)
|
|
$keyBytes = [Convert]::FromBase64String($sharedKey)
|
|
|
|
$sha256 = New-Object System.Security.Cryptography.HMACSHA256
|
|
$sha256.Key = $keyBytes
|
|
$calculatedHash = $sha256.ComputeHash($bytesToHash)
|
|
$encodedHash = [Convert]::ToBase64String($calculatedHash)
|
|
$authorization = 'SharedKey {0}:{1}' -f $customerId,$encodedHash
|
|
return $authorization
|
|
}
|
|
|
|
|
|
# Create the function to create and post the request
|
|
Function Post-LogAnalyticsData($customerId, $sharedKey, $body, $logType)
|
|
{
|
|
$method = "POST"
|
|
$contentType = "application/json"
|
|
$resource = "/api/logs"
|
|
$rfc1123date = [DateTime]::UtcNow.ToString("r")
|
|
$contentLength = $body.Length
|
|
$signature = Build-Signature `
|
|
-customerId $customerId `
|
|
-sharedKey $sharedKey `
|
|
-date $rfc1123date `
|
|
-contentLength $contentLength `
|
|
-method $method `
|
|
-contentType $contentType `
|
|
-resource $resource
|
|
$uri = "https://" + $customerId + ".ods.opinsights.azure.com" + $resource + "?api-version=2016-04-01"
|
|
|
|
$headers = @{
|
|
"Authorization" = $signature;
|
|
"Log-Type" = $logType;
|
|
"x-ms-date" = $rfc1123date;
|
|
"time-generated-field" = $TimeStampField;
|
|
}
|
|
|
|
$response = Invoke-WebRequest -Uri $uri -Method $method -ContentType $contentType -Headers $headers -Body $body -UseBasicParsing
|
|
return $response.StatusCode
|
|
|
|
}
|
|
|
|
Function Format_Size
|
|
{
|
|
param(
|
|
$size
|
|
)
|
|
If($size -eq $null){$FormatedSize = "0"}
|
|
ElseIf( $size -lt 1KB ){$FormatedSize = "$("{0:N2}" -f $size) B"}
|
|
ElseIf( $size -lt 1MB ){$FormatedSize = "$("{0:N2}" -f ($size / 1KB)) KB"}
|
|
ElseIf( $size -lt 1GB ){$FormatedSize = "$("{0:N2}" -f ($size / 1MB)) MB"}
|
|
ElseIf( $size -lt 1TB ){$FormatedSize = "$("{0:N2}" -f ($size / 1GB)) GB"}
|
|
ElseIf( $size -lt 1PB ){$FormatedSize = "$("{0:N2}" -f ($size / 1TB)) TB"}
|
|
return $FormatedSize
|
|
}
|
|
|
|
add-type -type @"
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.ComponentModel;
|
|
using System.IO;
|
|
|
|
namespace Disk
|
|
{
|
|
public class Size
|
|
{
|
|
[DllImport("kernel32.dll")]
|
|
static extern uint GetCompressedFileSizeW([In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
|
|
out uint lpFileSizeHigh);
|
|
|
|
public static ulong SizeOnDisk(string filename)
|
|
{
|
|
uint High_Order;
|
|
uint Low_Order;
|
|
ulong GetSize;
|
|
|
|
FileInfo CurrentFile = new FileInfo(filename);
|
|
Low_Order = GetCompressedFileSizeW(CurrentFile.FullName, out High_Order);
|
|
int GetError = Marshal.GetLastWin32Error();
|
|
|
|
if (High_Order == 0 && Low_Order == 0xFFFFFFFF && GetError != 0)
|
|
{
|
|
throw new Win32Exception(GetError);
|
|
}
|
|
else
|
|
{
|
|
GetSize = ((ulong)High_Order << 32) + Low_Order;
|
|
return GetSize;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
"@
|
|
|
|
Function OD_SizeOnDisk
|
|
{
|
|
param(
|
|
$Folder_to_check
|
|
)
|
|
|
|
$Get_All_Files = Get-ChildItem $Folder_to_check -recurse -ea silentlycontinue | Where-Object {! $_.PSIsContainer}
|
|
If($Get_All_Files.Count -gt 0)
|
|
{
|
|
$OD_Files_Array = @()
|
|
ForEach($File in $Get_All_Files)
|
|
{
|
|
If((test-path $File.FullName))
|
|
{
|
|
$SizeOnDisk = [Disk.Size]::SizeOnDisk($File.FullName)
|
|
If($Files_Size)
|
|
{
|
|
$OD_Obj = New-Object PSObject
|
|
Add-Member -InputObject $OD_Obj -MemberType NoteProperty -Name "File name" -Value $File.Name
|
|
Add-Member -InputObject $OD_Obj -MemberType NoteProperty -Name "Path" -Value $File.DirectoryName
|
|
Add-Member -InputObject $OD_Obj -MemberType NoteProperty -Name "Size" -Value $File.Length
|
|
Add-Member -InputObject $OD_Obj -MemberType NoteProperty -Name "Size on Disk" -Value $SizeOnDisk
|
|
$OD_Files_Array += $OD_Obj
|
|
}
|
|
|
|
$total_SizeOnSisk += $SizeOnDisk
|
|
$total_size += $File.Length
|
|
|
|
$Log_Analytics_TotalSize = ([System.Math]::Round(($total_size) / 1MB, 2))
|
|
$Log_Analytics_SizeOnSisk = ([System.Math]::Round(($total_SizeOnSisk) / 1MB, 2))
|
|
|
|
$Return_Array = $total_size, $total_SizeOnSisk, $Log_Analytics_TotalSize, $Log_Analytics_SizeOnSisk
|
|
}
|
|
}
|
|
return $Return_Array
|
|
}
|
|
Else
|
|
{
|
|
return 0
|
|
}
|
|
}
|
|
|
|
# Get computer model
|
|
$WMI_computersystem = gwmi win32_computersystem
|
|
$Manufacturer = $WMI_computersystem.manufacturer
|
|
If($Manufacturer -eq "lenovo")
|
|
{
|
|
$Get_Current_Model = $WMI_computersystem.SystemFamily.split(" ")[1]
|
|
}
|
|
Else
|
|
{
|
|
$Get_Current_Model = $WMI_computersystem.Model
|
|
}
|
|
|
|
|
|
# Get Hard disk size info
|
|
$Win32_LogicalDisk = Get-ciminstance Win32_LogicalDisk | where {$_.DeviceID -eq "C:"}
|
|
$Disk_Full_Size = $Win32_LogicalDisk.size
|
|
$Disk_Free_Space = $Win32_LogicalDisk.Freespace
|
|
# Format hard disk size
|
|
$Total_size_NoFormat = [Math]::Round(($Disk_Full_Size))
|
|
$Free_size_formated = Format_Size -size $Disk_Free_Space
|
|
$Total_size_formated = Format_Size -size $Disk_Full_Size
|
|
# Hard disk size percent
|
|
[int]$Free_Space_percent = '{0:N0}' -f (($Disk_Free_Space / $Total_size_NoFormat * 100),1)
|
|
If($Free_Space_percent -le 10)
|
|
{
|
|
$Disk_FreeSpace_State = "Alert"
|
|
}
|
|
ElseIf(($Free_Space_percent -gt 10) -and ($Free_Space_percent -lt 20))
|
|
{
|
|
$Disk_FreeSpace_State = "Warning"
|
|
}
|
|
ElseIf(($Free_Space_percent -ge 20) -and ($Free_Space_percent -lt 70))
|
|
{
|
|
$Disk_FreeSpace_State = "OK"
|
|
}
|
|
ElseIf($Free_Space_percent -ge 70)
|
|
{
|
|
$Disk_FreeSpace_State = "Awesome"
|
|
}
|
|
|
|
# Hard disk size Log Anaytics format
|
|
$Log_Analytics_Disk_Size = (OD_SizeOnDisk -Folder_to_check $Disk_Full_Size)
|
|
$Log_Analytics_Disk_Size = ([System.Math]::Round(($Disk_Full_Size) / 1MB, 2))
|
|
$Log_Analytics_Disk_FreeSpace = ([System.Math]::Round(($Disk_Free_Space) / 1MB, 2))
|
|
|
|
# Get Recycle bin size
|
|
$Recycle_Bin_Size = (Get-ChildItem -LiteralPath 'C:\$Recycle.Bin' -File -Force -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum
|
|
$Global:RecycleBin_size_Percent = '{0:N0}' -f (($Recycle_Bin_Size / $Disk_Full_Size * 100),1)
|
|
|
|
# Get OneDrive full size and size on disk
|
|
$OD_Path = (Get-ItemProperty "HKCU:\SOFTWARE\Microsoft\OneDrive\Accounts\Business1").UserFolder
|
|
# Path of main folders: desktop, documents, pictures
|
|
$Documents_Path = [System.Environment]::GetFolderPath("MyDocuments")
|
|
$Desktop_Path = [System.Environment]::GetFolderPath("Desktop")
|
|
$Pictures_Path = [System.Environment]::GetFolderPath("MyPictures")
|
|
|
|
|
|
# get larger folders from C:\Users
|
|
$MostWanted_Folders_Users = @()
|
|
$Get_Users_Directories = Get-ChildItem "C:\users" -Directory -Recurse -ea silentlycontinue
|
|
ForEach($Directory in $Get_Users_Directories)
|
|
{
|
|
$Dir_FullName = $Directory.FullName
|
|
$Directory_Size_OnDisk = (OD_SizeOnDisk -Folder_to_check $Dir_FullName)[1]
|
|
$Directory_Formated_Size = Format_Size -size $Directory_Size_OnDisk
|
|
If($Directory_Size_OnDisk -gt 0)
|
|
{
|
|
$Obj = New-Object PSObject
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "Path" -Value $Dir_FullName
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "Size" -Value $Directory_Formated_Size
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "FullSize" -Value $Directory_Size_OnDisk
|
|
$MostWanted_Folders_Users += $Obj
|
|
}
|
|
}
|
|
$Top_10_Folders_Users = $MostWanted_Folders_Users | Sort-Object -Property FullSize -Descending | Select-Object -First 10
|
|
foreach($Folder in $Top_10_Folders_Users)
|
|
{
|
|
$Folder_Path = $Folder.Path
|
|
$Folder_Size = $Folder.Size
|
|
$Folders_In_Users += "$Folder_Path ($Folder_Size)`n"
|
|
}
|
|
|
|
|
|
# Get larger folders from current user profile
|
|
$MostWanted_Folders_UserProfile = @()
|
|
$Current_User_Profile = Get-ChildItem Registry::\HKEY_USERS -ea silentlycontinue | Where-Object { Test-Path "$($_.pspath)\Volatile Environment" } | ForEach-Object { (Get-ItemProperty "$($_.pspath)\Volatile Environment").USERPROFILE }
|
|
$Get_CurrentUser_Directories = Get-ChildItem $Current_User_Profile -Directory -Recurse -ea silentlycontinue
|
|
ForEach($Directory in $Get_CurrentUser_Directories)
|
|
{
|
|
$Dir_FullName = $Directory.FullName
|
|
$Directory_Size_OnDisk = (OD_SizeOnDisk -Folder_to_check $Dir_FullName)[1]
|
|
$Directory_Formated_Size = Format_Size -size $Directory_Size_OnDisk
|
|
If($Directory_Size_OnDisk -gt 0)
|
|
{
|
|
$Obj = New-Object PSObject
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "Path" -Value $Dir_FullName
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "Size" -Value $Directory_Formated_Size
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "FullSize" -Value $Directory_Size_OnDisk
|
|
$MostWanted_Folders_UserProfile += $Obj
|
|
}
|
|
}
|
|
$Top_10_Folders_UserProfile = $MostWanted_Folders_UserProfile | Sort-Object -Property FullSize -Descending | Select-Object -First 10
|
|
foreach($User_Folder in $Top_10_Folders_UserProfile)
|
|
{
|
|
$User_Folder_Path = $User_Folder.Path
|
|
$Uer_Folder_Size = $User_Folder.Size
|
|
$Folders_In_UserProfile += "$User_Folder_Path ($Uer_Folder_Size)`n"
|
|
}
|
|
|
|
|
|
|
|
|
|
# Get larger folders from C:
|
|
$MostWanted_Folders_C = @()
|
|
$Get_C_Directories = Get-ChildItem "C:\" | Where-Object{(($_.PSIsContainer) -and ($_.name -ne "Users"))}
|
|
foreach ($Directory in $Get_C_Directories)
|
|
{
|
|
$Dir_Name = $Directory.FullName
|
|
$Folder_Size = (Get-ChildItem $Dir_Name -Recurse -Force | Measure-Object -Property Length -Sum).Sum 2> $null
|
|
If($Folder_Size -gt 0)
|
|
{
|
|
$Formated_Size = Format_Size -size $Folder_Size
|
|
$Obj = New-Object PSObject
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "Path" -Value $Dir_Name
|
|
Add-Member -InputObject $Obj -MemberType NoteProperty -Name "Size" -Value $Formated_Size
|
|
$MostWanted_Folders_C += $Obj
|
|
}
|
|
}
|
|
|
|
$Top_10_Folders_C = $MostWanted_Folders_C | Sort-Object -Property FullSize -Descending | Select-Object -First 10
|
|
foreach($Folder in $Top_10_Folders_C)
|
|
{
|
|
$Folder_Path = $Folder.Path
|
|
$Folder_Size = $Folder.Size
|
|
$Folders_In_C += "$Folder_Path ($Folder_Size)`n"
|
|
}
|
|
|
|
|
|
|
|
|
|
$OD_Main_Size = (OD_SizeOnDisk -Folder_to_check $OD_Path)
|
|
$OD_FullSize = $OD_Main_Size[0]
|
|
$OD_SizeDisk = $OD_Main_Size[1]
|
|
# Format disk size
|
|
$Formated_OD_FullSize = Format_Size -size $OD_FullSize
|
|
$Formated_OD_SizeOnDisk = Format_Size -size $OD_SizeDisk
|
|
# OneDrive full size and size on disk Log Anaytics format
|
|
$LogAnalytics_OD_FullSize = $OD_Main_Size[2]
|
|
$LogAnalytics_OD_SizeDisk = $OD_Main_Size[3]
|
|
# OneDrive size on disk percent
|
|
$ODUsedSpaceOnDisk = [Math]::round((($OD_FullSize/$Total_size_NoFormat) * 100),2)
|
|
|
|
If($ODUsedSpaceOnDisk -le 10)
|
|
{
|
|
$OneDrive_UseSize_State = "Awesome"
|
|
}
|
|
ElseIf(($ODUsedSpaceOnDisk -gt 10) -and ($ODUsedSpaceOnDisk -lt 40))
|
|
{
|
|
$OneDrive_UseSize_State = "OK"
|
|
}
|
|
ElseIf(($ODUsedSpaceOnDisk -gt 0) -and ($ODUsedSpaceOnDisk -lt 50))
|
|
{
|
|
$OneDrive_UseSize_State = "Warning"
|
|
}
|
|
ElseIf($ODUsedSpaceOnDisk -ge 50)
|
|
{
|
|
$OneDrive_UseSize_State = "Alert"
|
|
}
|
|
|
|
|
|
$OD_Documents_Size = (OD_SizeOnDisk -Folder_to_check $Documents_Path)
|
|
$OD_Documents_FullSize = $OD_Documents_Size[0]
|
|
$LogAnalytics_OD_Documents_FullSize = $OD_Documents_Size[2]
|
|
$Formated_Documents_Size = Format_Size -size $OD_Documents_FullSize
|
|
$Get_OD_Documents_SizeOnDisk = $OD_Documents_Size[1]
|
|
$LogAnalytics_OD_Documents_SizeOnDisk = $OD_Documents_Size[3]
|
|
$Formated_Documents_SizeOnDisk = Format_Size -size $Get_OD_Documents_SizeOnDisk
|
|
|
|
$OD_Desktop_Size = (OD_SizeOnDisk -Folder_to_check $Desktop_Path)
|
|
$OD_Desktop_FullSize = $OD_Desktop_Size[0]
|
|
$LogAnalytics_OD_Desktop_FullSize = $OD_Desktop_Size[2]
|
|
$Formated_Desktop_Size = Format_Size -size $OD_Desktop_FullSize
|
|
$Get_OD_Desktop_SizeOnDisk = $OD_Desktop_Size[1]
|
|
$LogAnalytics_OD_Desktop_SizeOnDisk = $OD_Desktop_Size[3]
|
|
$Formated_Desktop_SizeOnDisk = Format_Size -size $Get_OD_Desktop_SizeOnDisk
|
|
|
|
$OD_Pictures_Size = (OD_SizeOnDisk -Folder_to_check $Pictures_Path)
|
|
$OD_Pictures_FullSize = $OD_Pictures_Size[0]
|
|
$LogAnalytics_OD_Pictures_FullSize = $OD_Pictures_Size[2]
|
|
$Formated_Pictures_Size = Format_Size -size $OD_Pictures_FullSize
|
|
$Get_OD_Pictures_SizeOnDisk = $OD_Pictures_Size[1]
|
|
$LogAnalytics_OD_Pictures_SizeOnDisk = $OD_Pictures_Size[3]
|
|
$Formated_Pictures_SizeOnDisk = Format_Size -size $Get_OD_Pictures_SizeOnDisk
|
|
|
|
# Check if Always keep on this device is selected at OneDrive root
|
|
$Get_OD_Attribute = (Get-Item $OD_Path).Attributes
|
|
If(($Get_OD_Attribute -eq 525360) -or ($Get_OD_Attribute -like "525*"))
|
|
{
|
|
$Always_Keep_device = "Oui"
|
|
}
|
|
Else
|
|
{
|
|
$Always_Keep_device = "Non"
|
|
}
|
|
|
|
# write-output "$Total_size_formated; $Free_size_formated; $Formated_OD_FullSize; $Formated_OD_SizeOnDisk; $Formated_Desktop_Size; $Formated_Desktop_SizeOnDisk; $Formated_Documents_Size; $Formated_Documents_SizeOnDisk; $Formated_Pictures_Size; $Formated_Pictures_SizeOnDisk; $Free_Space_percent %;$ODUsedSpaceOnDisk %; $OD_Path; $Desktop_Path; $Documents_Path; $Pictures_Path; $Always_Keep_device; $Folder_Value_PBI"
|
|
|
|
# Create the object
|
|
$Properties = [Ordered] @{
|
|
"ComputerName" = $env:computername
|
|
"UserEmail" = $env:username
|
|
"OneDrivePath" = $OD_Path
|
|
"DesktopPath" = $Desktop_Path
|
|
"DocumentsPath" = $Documents_Path
|
|
"PicturesPath" = $Pictures_Path
|
|
"AlwaysKeepDevice" = $Always_Keep_device
|
|
"HardDiskSizeMb" = $Log_Analytics_Disk_Size
|
|
"HardDiskSizeFreeSpaceMb" = $Log_Analytics_Disk_FreeSpace
|
|
"OneDriveFullSizeMb" = $LogAnalytics_OD_FullSize
|
|
"OneDriveSizeOnDiskMb" = $LogAnalytics_OD_SizeDisk
|
|
"DocumentsSizeMb" = $LogAnalytics_OD_Documents_FullSize
|
|
"DocumentsSizeOnDiskMb" = $LogAnalytics_OD_Documents_SizeOnDisk
|
|
"DesktopSizeMb" = $LogAnalytics_OD_Desktop_FullSize
|
|
"DesktopSizeOnDiskMb" = $LogAnalytics_OD_Desktop_SizeOnDisk
|
|
"PicturesSizeMb" = $LogAnalytics_OD_Pictures_FullSize
|
|
"PicturesSizeOnDiskMb" = $LogAnalytics_OD_Pictures_SizeOnDisk
|
|
"HardDiskFreeSpacePercent" = $Free_Space_percent
|
|
"DiskFreeSpaceState" = $Disk_FreeSpace_State
|
|
"ODUsedSizePercent" = $ODUsedSpaceOnDisk
|
|
"OneDriveUseSizeState" = $OneDrive_UseSize_State
|
|
"RecycleBinSize" = $Recycle_Bin_Size
|
|
"RecycleBinSizePercent" = $RecycleBin_size_Percent
|
|
"DeviceModel" = $Get_Current_Model
|
|
"Top10UsersFolder" = $Folders_In_Users
|
|
"Top10CurrentUserFolder" = $Folders_In_UserProfile
|
|
"Top10CFolder" = $Folders_In_C
|
|
}
|
|
$ODSize = New-Object -TypeName "PSObject" -Property $Properties
|
|
|
|
|
|
|
|
|
|
write-output $ODSize
|
|
|
|
# Submit the data to the API endpoint
|
|
$ODSizeJson = $ODSize | ConvertTo-Json
|
|
$params = @{
|
|
CustomerId = $customerId
|
|
SharedKey = $sharedKey
|
|
Body = ([System.Text.Encoding]::UTF8.GetBytes($ODSizeJson))
|
|
LogType = $LogType
|
|
}
|
|
$LogResponse = Post-LogAnalyticsData @params |