Eu escrevi este script aqui para obter alguns dados de processos quando preciso "depurar" uma falha do sistema. Ele criará um job de fundo em uma sessão do powershell que aguarda a saída de um processo
Ele obtém todas as informações GDI-Objects, Handles, RAM etc. para cada processo em execução na estação de trabalho. Talvez você possa tentar pegar o processo que cria a falha com isso.
i GUESS desde que o computador congela, que o processo explorer.exe não está respondendo. Portanto, dispararemos o script get-data sempre que a propriedade de resposta do explorer.exe não for verdadeira.
Basta iniciar este script em uma sessão do powershell em qualquer estação de trabalho desejada. Ele visualizará uma falha por meio do texto do balão na bandeja do Notify. Se você quiser uma notificação por email, basta colocar um Send-Mailmessage
após a Get-MachineData
parte.
você pode usar o PowerShell enquanto a tarefa em segundo plano está em execução. Use get-job
para ver se o trabalho realmente está em execução.
As informações detalhadas serão salvas em% userprofile% \ ProcessDetails.txt
Start-Job -name CatchSystemFailure {
$sig = @'
[DllImport("User32.dll")] public static extern int GetGuiResources(IntPtr hProcess, int uiFlags);
'@
Add-Type -MemberDefinition $sig -name NativeMethods -namespace Win32
[Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
function Get-MachineData(
[switch]$AllProcessDetails,
[switch]$RAM
)
{
switch($PSBoundParameters.GetEnumerator().Where({$_.Value -eq $true}).Key)
{
'AllProcessDetails' {
$processes = [Diagnostics.Process]::GetProcesses() |
select Name, Responding, NPM, PM, WS, VM, Cpu, Handles, @{n='GDI-Objects';e={
[Win32.NativeMethods]::GetGuiResources($_.Handle, 0).ToString()}
} | sort Name
Write-Output $processes
}
'RAM' {
$ComputerSystem = gwmi Win32_operatingsystem -Property TotalVisibleMemorySize, FreePhysicalMemory
$FreePhysicalMemory = "{0:N2}" -f (($ComputerSystem.FreePhysicalMemory) / (1mb))
$TotalVisibleMemorySize = "{0:N2}" -f (($ComputerSystem.TotalVisibleMemorySize) / (1mb))
$TotalFreeMemPerc = "{0:N2}" -f (($FreePhysicalMemory/$TotalVisibleMemorySize)*100)
$Memory = New-Object PSCustomObject –Prop (@{
'Server-RAM'=$TotalVisibleMemorySize + "GB";
'Free RAM'=$FreePhysicalMemory + "GB";
'Free RAM in %'=$TotalFreeMemPerc + "%"
}) | fl *
Write-Output $Memory
}
}}
while ((Get-Process system).Responding) {sleep -Milliseconds 50}
if (!(Get-Process system).Responding) {
$SystrayIcon = New-Object System.Windows.Forms.NotifyIcon
$SystrayIcon.Icon = [system.drawing.icon]::ExtractAssociatedIcon($pshome + "\powershell.exe")
$SystrayIcon.BalloonTipText = "system failure! inform your systemadministrator!"
$SystrayIcon.BalloonTipTitle = "Process Watcher"
$SystrayIcon.Visible = $true
$SystrayIcon.ShowBalloonTip(600)
$SystrayIcon.dispose()
Get-MachineData -AllProcessDetails -RAM | out-file $env:USERPROFILE\ProcessDetails.txt -Force
}
} | out-null