derwowusste
Goto Top

Per Skript eigene Prozesse finden, die elevated laufen

Moin Kollegen.

Zur Veranschaulichung der Frage hier ein Screenshot:
capture
Ich würde gerne per Skript auslesen können, welche Prozesse unter meinem Usernamen laufen und gleichzeitig elevated (deutscher Taskmanager: "heraufgestuft") sind.

Ersteres bekomme ich ja noch mühelos hin, aber ob elevated oder nicht, gelingt mir nicht.

Content-Key: 556055

Url: https://administrator.de/contentid/556055

Printed on: April 26, 2024 at 04:04 o'clock

Member: Cloudrakete
Cloudrakete Mar 09, 2020 at 10:21:44 (UTC)
Goto Top
Moin ...

Ich hab nur ein Skript welches alle Prozesse auflistet welche elevated laufen.
Aber das sollte ja mit wenig Arbeit anpassbar sein face-smile

Get-Process |
Add-Member -Name Elevated -MemberType ScriptProperty -Value {if ($this.Name -in @('Idle','System')) {$null} else {-not $this.Path -and -not $this.Handle} } -PassThru |
Format-Table Name,Elevated
Member: DerWoWusste
DerWoWusste Mar 09, 2020 at 10:41:08 (UTC)
Goto Top
Moin.

Ja, das ist das Erste, was man ergoogelt. Nee, damit komme ich nicht weiter - Du? Wenn ich mir daraus alle Prozessnamen greife, die True eingestuft sind, dann habe ich weiterhin Schwierigkeiten, dies mit der Liste der eigenen Prozesse zu vergleichen.
Member: TomTomBon
TomTomBon Mar 09, 2020 at 10:44:34 (UTC)
Goto Top
Moin DWW,

Selbst im ProcExp wird mir nur angezeigt das ein elevated process im Admin Benutzer läuft und Ich keine weiteren Info bekomme.
Auch wenn Ich ihn als Admin starte.

Ich bin gespannt ob es eine Lösung gibt face-smile

Thomas
Member: Cloudrakete
Cloudrakete Mar 09, 2020 at 10:47:00 (UTC)
Goto Top
Kann sein, dass Ding ausm Internet kommt, lag noch in meinem OneNote rum :D
Was ist denn das Ziel dieser Auswertung? Vielleicht gibt es ja noch andere Lösungswege.
Member: DerWoWusste
DerWoWusste Mar 09, 2020 at 10:56:26 (UTC)
Goto Top
Was ist denn das Ziel dieser Auswertung? Vielleicht gibt es ja noch andere Lösungswege.
Ja, die Frage ist immer berechtigt face-smile

Es soll dokumentiert werden, welche Software im Haus elevated läuft und wer diese ausführt. Die Möglichkeiten der Überwachung von Tokengenerierung usw. sind mir bekannt und ich finde diese sehr unschön, weil unübersichtlich. Ich möchte lieber einen geplanten Task verteilen, der für eine Weile läuft und alle 5 Minuten diese Abfrage macht.
Member: Kartoffelpelle
Kartoffelpelle Mar 09, 2020 at 11:47:28 (UTC)
Goto Top
Ersteres bekomme ich ja noch mühelos hin, aber ob elevated oder nicht, gelingt mir nicht.

SysInternals AccessChk könnte ggf. helfen?

VG
Kartoffelpelle
Member: colinardo
Solution colinardo Mar 09, 2020 updated at 12:07:43 (UTC)
Goto Top
Servus DWW,
mal schnell in PS runtergetippt, probier mal ...
(Listet elevated Prozesse von allen Usern der Maschine und excludiert den elevated Prozess unter dem das Skript selbst läuft)
#Requires -RunAsAdministrator

function Get-ProcessElevation {
    param([parameter(Mandatory=$true,ValueFromPipeline=$true)][System.Diagnostics.Process]$process)
    begin {
        if(!('WIn32.Tools' -as [type])){  
            Add-Type –MemberDefinition '  
            [DllImport("advapi32.dll", SetLastError = true)]  
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool OpenProcessToken(IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);

            [DllImport("advapi32.dll", SetLastError = true)]  
            public static extern bool GetTokenInformation(IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength);

            [DllImport("kernel32.dll", SetLastError = true)]  
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool CloseHandle(IntPtr hObject);
            
            public enum TOKEN_INFORMATION_CLASS
            {
                TokenUser = 1,
                TokenGroups,
                TokenPrivileges,
                TokenOwner,
                TokenPrimaryGroup,
                TokenDefaultDacl,
                TokenSource,
                TokenType,
                TokenImpersonationLevel,
                TokenStatistics,
                TokenRestrictedSids,
                TokenSessionId,
                TokenGroupsAndPrivileges,
                TokenSessionReference,
                TokenSandBoxInert,
                TokenAuditPolicy,
                TokenOrigin,
                TokenElevationType,
                TokenLinkedToken,
                TokenElevation,
                TokenHasRestrictions,
                TokenAccessInformation,
                TokenVirtualizationAllowed,
                TokenVirtualizationEnabled,
                TokenIntegrityLevel,
                TokenUIAccess,
                TokenMandatoryPolicy,
                TokenLogonSid,
                MaxTokenInfoClass
            }
    
            public enum TOKEN_ELEVATION_TYPE
            {
                TokenElevationTypeDefault = 1,
                TokenElevationTypeFull,
                TokenElevationTypeLimited
            }
        ' -name "tools" -namespace Win32 –passThru -EA SilentlyContinue | out-null  
    }
    $elevationresult = [Win32.tools+TOKEN_ELEVATION_TYPE]::TokenElevationTypeDefault
    }

    process{
        [System.IntPtr]$tokenhandle = [System.IntPtr]::Zero
        [System.IntPtr]$elevationTypePtr = [System.IntPtr]::Zero

        try{    
            if ([Win32.Tools]::OpenProcessToken([System.IntPtr]$process.Handle,(0x00020000 -bor 0x0008),[ref]$tokenhandle)){
                [int]$elevationResultSize = [System.Runtime.InteropServices.Marshal]::SizeOf([int]$elevationresult)
                [int]$returnedSize = 0
                [System.IntPtr]$elevationTypePtr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal($elevationResultSize)

                if ([Win32.Tools]::GetTokenInformation($tokenhandle,[Win32.tools+TOKEN_INFORMATION_CLASS]::TokenElevationType,$elevationTypePtr,$elevationResultSize,[ref]$returnedSize)){
                    $elevationresult = [Win32.tools+TOKEN_ELEVATION_TYPE][System.Runtime.InteropServices.Marshal]::ReadInt32($elevationTypePtr)
                    $process | Add-Member -MemberType NoteProperty -Name Elevated -Value ($elevationresult -eq [Win32.tools+TOKEN_ELEVATION_TYPE]::TokenElevationTypeFull) -PassThru
                }
            }
        }catch{
            return $false
        }finally{
            if($elevationTypePtr -ne [Intptr]::Zero){
                [System.Runtime.InteropServices.Marshal]::FreeHGlobal($elevationTypePtr)
            }
            if($tokenhandle -ne [Intptr]::Zero){
                [Win32.Tools]::CloseHandle($tokenhandle) | out-null
            }
        }
    }
  
}

Get-Process -IncludeUserName | Get-ProcessElevation | ?{$_.Elevated -and $_.id -ne $pid} | select Name,Username,Elevated
Grüße Uwe
Member: DerWoWusste
DerWoWusste Mar 09, 2020 at 12:26:45 (UTC)
Goto Top
Das passt!
Herzlichen Dank, Uwe!

Frage am Rande: welchen Powershellkurs empfiehlst Du, der nicht bei Null anfängt, aber kurz dahinter?
Member: colinardo
colinardo Mar 09, 2020 updated at 13:02:01 (UTC)
Goto Top
Zitat von @DerWoWusste:
Frage am Rande: welchen Powershellkurs empfiehlst Du, der nicht bei Null anfängt, aber kurz dahinter?
Also wenn es über die Grundlagen der Sprachelemente und CMDLets hinaus geht dann würde ich jegliche c# Doku und die des .NET Frameworks empfehlen. Im Grunde basiert die PS ja komplett darauf und man kann so gut wie alles was du mit c# machen kannst auch in die PS Syntax umschreiben. Eine gute c# Programmier Basis bringt einen auf jeden Fall weiter wenn man Dinge machen möchte die die "normale" PS Tutorials so nicht unbedingt behandeln. Allgemeine Kenntnisse wie man Win32 Funktionen aufrufen kann und wie man Typen und Klassem anwendet sind auch nicht verkehrt. Man lernt halt viele Dinge und Varianten mit der Zeit (die man leider oft nicht hat), da helfen da oft meist nur Nachtschichten/Überstunden.
Links zu Kursen/Tutorials kann ich dir momentan keine bieten da bin ich nicht mehr aktuell, hatte mal selbst angefangen sowas zusammen zu schreiben, aber das wie so oft leider aus Zeitmangel abbrechen müssen da das Feld ja sehr vielfältig ist wenn man alles irgendwie versucht in ein umfassendes Werk zu pressen.
Member: DerWoWusste
DerWoWusste Mar 09, 2020 at 13:03:07 (UTC)
Goto Top
Ok.

Ich lerne am besten immer aus Codebeispielen. Kennst Du da Tutorialseiten für Grundlagen, die Dir gefallen?
Member: colinardo
colinardo Mar 09, 2020 at 13:55:19 (UTC)
Goto Top
Ohne zu wissen zu welchen Themen genau z.B. mal eins rausgepickt
https://devblogs.microsoft.com/scripting/
Member: DerWoWusste
DerWoWusste Mar 09, 2020 at 14:01:25 (UTC)
Goto Top
Ja, der Blog ist bekannt und sehr nett und ausführlich.
Ich werde mir einfach mehr Zeit nehmen müssen, sonst bleibe ich noch "Stammkunde" bei Dir bis zum Sankt Nimmerleinstag face-smile

Danke
Member: AnkhMorpork
AnkhMorpork Mar 10, 2020 at 07:25:32 (UTC)
Goto Top
Member: DerWoWusste
DerWoWusste Mar 10, 2020 at 07:59:29 (UTC)
Goto Top
Danke Dir!