Harmonogram zadań uruchamia skrypt powłoki zasilania — błąd nazwy użytkownika?

Mam więc skrypt powershell, który gdy użytkownik loguje się do komputera, wysyła do mnie e-mailem szczegóły logowania, na przykład nazwę użytkownika, adres IP, lokalizację itp. Działa z harmonogramu zadań i ma wyzwalacz podczas logowania.

Skrypt działa dobrze przez powershell mój problem Mam to, że bez względu na to, kto się w nim loguje, zawsze uruchamia skrypt na moim koncie w harmonogramie zadań, dlatego zawsze wpisuję moje imię jako nazwę użytkownika, nawet jeśli inny użytkownik może być zalogowany. wywoływanie nazwy użytkownika na wiele sposobów, ale zawsze pokazuje moje imię, ponieważ działa z mojego konta.

Za wywołanie nazwy użytkownika, której użyłem:

$username = [System.Security.Principal.Windows Identity]::GetCurrent().Name

$env:NazwaUżytkownika

$env:UserDomain

Wszystkie zwracają użytkownika, który uruchamia zaplanowane zadanie.

Jakakolwiek pomoc w wydrukowaniu prawdziwego użytkownika, który się zalogował, byłaby bardzo mile widziana.

Dziękuję.


person PaulA    schedule 02.06.2020    source źródło
comment
Czy możesz opublikować kod, który wypróbowałeś? Mówisz, że próbowałeś już wielu rzeczy – pomocne będzie sprawdzenie, co to jest, i unikniesz sugerowania przez kogoś czegoś, o czym już wiesz, że nie działa.   -  person boxdog    schedule 02.06.2020
comment
Oczywiście do wywołania nazwy użytkownika próbowałem - $username = [System.Security.Principal.Windows Identity]::GetCurrent().Name, $env:UserName i $env:UserDomain. Wszystkie zwracają użytkownika, który uruchamia zaplanowane zadanie.   -  person PaulA    schedule 02.06.2020


Odpowiedzi (1)


Może to być spowodowane tym, że zaplanowane zadanie jest wykonywane przy użyciu Twoich poświadczeń. Niestety nie da się tego obejść. To powiedziawszy, możesz pominąć to zachowanie, uzyskując konto użytkownika powiązane z procesem explorer.exe:

$username = Get-WmiObject Win32_Process -Filter "Name='explorer.exe'" | ForEach-Object { $_.GetOwner() } | Select-Object -Unique -Expand User

Powinno to działać dobrze, o ile nigdy nie znajdziesz się w sytuacji, w której wielu użytkowników może być jednocześnie zalogowanych do komputera (szybkie przełączanie użytkowników, usługi terminalowe itp.)

EDYCJA: Aby uzyskać to, czego szukasz, możesz potrzebować czegoś więcej

$op = @()
$owners = Get-WmiObject Win32_Process -Filter "Name='explorer.exe'" | ForEach-Object { $_.GetOwner() } | Select-Object -Unique -Expand User
foreach($owner in $owners)
{
    $wmiprocs = get-wmiobject win32_process -filter "Name='explorer.exe'" | where { $_.getowner().user -eq $owner } | select-object processid
    $procs = $wmiprocs | % { get-process -id $_.processid | select-object starttime }
    $obj = new-object object
    $obj | add-member -type noteproperty -name Username $owner
    $obj | add-member -type noteproperty -name Logon ($procs | sort -descending)[0].starttime
    $op += $obj
}

$op | ft -auto

Pamiętaj, że Twoja instancja PowerShell będzie musiała działać jako administrator, aby wysyłać zapytania do procesów innych użytkowników.

person LordPupazz    schedule 02.06.2020
comment
Cześć, dzięki za to. Teraz wydaje się, że pomija nazwę harmonogramu zadań, ale wydaje mi się, że wyświetla wielu użytkowników, którzy są zalogowani. Czy mimo wszystko można to podzielić na najnowsze, czy nie jest to możliwe? Jeśli nie, być może będę w stanie to wykorzystać, po prostu wyświetlając to w inny sposób. - person PaulA; 02.06.2020
comment
Używając tej metody, nie jest to możliwe. Lepsze wyniki można uzyskać, monitorując dziennik zabezpieczeń dla identyfikatora zdarzenia 4624 i wyodrębniając dane ze zdarzenia. Ponownie natkniesz się na ponowne uwierzytelnienia i zdarzenia odświeżania tokenów itp., które utrudnią wybranie prawdziwych loginów. - person LordPupazz; 02.06.2020
comment
Myśląc o tym, obiekt WMI ma właściwość ProcessId, którą można również przechwycić i przekazać do polecenia cmdlet Get-Process -Id, aby uzyskać dostęp do właściwości StartTime tych obiektów, którą można następnie uporządkować w celu pobrania najnowszego wpisu (ostatnio uruchomiony proces) - person LordPupazz; 02.06.2020
comment
Ciekawe, może to być coś, czemu będę musiał się przyjrzeć, ponieważ chciałbym mieć najnowsze. Dzięki za pomoc. Obecnie otrzymuję System.Object[] jako dane wyjściowe w wiadomości e-mail, którą przypuszczam, ponieważ wiele osób wraca po IP itp., Ponieważ wiele osób się zalogowało. - person PaulA; 02.06.2020
comment
@PaulA Może mam dla Ciebie odpowiedź - zaktualizowałem swój kod o dodatkowy przykład. - person LordPupazz; 02.06.2020
comment
Naprawdę doceniam twoją pomoc w tym. Uruchomiłem to w nowym skrypcie i wygląda świetnie. Spróbuję teraz zaimplementować to w obecnym skrypcie i zobaczę, jak to działa. - person PaulA; 02.06.2020