Powershell

Pitäisi saada listattua kaikki avoimet paikalliset käyttäjät siten, että jokaisesta kerrotaan käyttäjänimi, koko nimi, kaikki ryhmät joissa tunnus on ja lastlogon

Saan tällä hetkellä listattua nuo erikseen, mutta koska tunnuksia riittää melkoisesti pitäisi saada suoraan yhdistetty lista. Tuon ei kuvitteli olen osaavalle vaikea, mutta omat yritykset eivät ole vielä tuottaneet toimivaa versiota

ChatGPT on omiaan näitä varten.

Esimerkkinä vaikka tämä koodi jonka generoin chatgpt:llä

Koodi:
# Listaa kaikki paikalliset käyttäjät, jotka eivät ole poistettu käytöstä
$users = Get-LocalUser | Where-Object { -not $_.Disabled }

# Kerätään tiedot jokaisesta käyttäjästä
$result = foreach ($u in $users) {
    try {
        # Käyttäjän ryhmät
        $groups = (Get-LocalGroup | ForEach-Object {
            try {
                if (Get-LocalGroupMember -Group $_.Name -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq $u.Name }) {
                    $_.Name
                }
            } catch {}
        }) -join ", "

        # Viimeinen kirjautuminen (jos saatavilla)
        $lastLogon = $u.LastLogon
        if (-not $lastLogon) { $lastLogon = "Ei tietoa" }

        # Tulostetaan yhteen objektiin
        [PSCustomObject]@{
            Käyttäjänimi = $u.Name
            KokoNimi     = $u.FullName
            Ryhmät       = $groups
            LastLogon    = $lastLogon
        }
    } catch {
        Write-Warning "Virhe käyttäjän $($u.Name) kohdalla: $_"
    }
}

# Näytetään tulos taulukkona
$result | Sort-Object Käyttäjänimi | Format-Table -AutoSize
 
ChatGPT on omiaan näitä varten.

Esimerkkinä vaikka tämä koodi jonka generoin chatgpt:llä

Koodi:
# Listaa kaikki paikalliset käyttäjät, jotka eivät ole poistettu käytöstä
$users = Get-LocalUser | Where-Object { -not $_.Disabled }

# Kerätään tiedot jokaisesta käyttäjästä
$result = foreach ($u in $users) {
    try {
        # Käyttäjän ryhmät
        $groups = (Get-LocalGroup | ForEach-Object {
            try {
                if (Get-LocalGroupMember -Group $_.Name -ErrorAction SilentlyContinue | Where-Object { $_.Name -eq $u.Name }) {
                    $_.Name
                }
            } catch {}
        }) -join ", "

        # Viimeinen kirjautuminen (jos saatavilla)
        $lastLogon = $u.LastLogon
        if (-not $lastLogon) { $lastLogon = "Ei tietoa" }

        # Tulostetaan yhteen objektiin
        [PSCustomObject]@{
            Käyttäjänimi = $u.Name
            KokoNimi     = $u.FullName
            Ryhmät       = $groups
            LastLogon    = $lastLogon
        }
    } catch {
        Write-Warning "Virhe käyttäjän $($u.Name) kohdalla: $_"
    }
}

# Näytetään tulos taulukkona
$result | Sort-Object Käyttäjänimi | Format-Table -AutoSize
Muuten hyvä, mutta ei listaa ryhmiä kun kokeilin ajaa sen. Lisäksi varsin hidas, mutta se on sivuseikka jos muuten toimii
 
Muuten hyvä, mutta ei listaa ryhmiä kun kokeilin ajaa sen. Lisäksi varsin hidas, mutta se on sivuseikka jos muuten toimii
Koodi:
# Listaa kaikki paikalliset käyttäjät, jotka eivät ole poistettu käytöstä
$users = Get-LocalUser | Where-Object { -not $_.Disabled }

# Haetaan kaikki ryhmät ja niiden jäsenet etukäteen
$groupMap = @{}
foreach ($group in Get-LocalGroup) {
    try {
        $members = Get-LocalGroupMember -Group $group.Name -ErrorAction SilentlyContinue
        $groupMap[$group.Name] = $members
    } catch {
        $groupMap[$group.Name] = @()
    }
}

# Kerätään tiedot jokaisesta käyttäjästä
$result = foreach ($u in $users) {
    try {
        # Käyttäjän ryhmät SID-tunnisteen perusteella
        $userSID = $u.SID
        $groupList = @()
        foreach ($entry in $groupMap.GetEnumerator()) {
            if ($entry.Value | Where-Object { $_.SID -eq $userSID }) {
                $groupList += $entry.Key
            }
        }
        $groups = $groupList -join ", "

        # Viimeinen kirjautuminen (jos saatavilla)
        $lastLogon = $u.LastLogon
        if (-not $lastLogon) { $lastLogon = "Ei tietoa" }

        # Tulostetaan yhteen objektiin
        [PSCustomObject]@{
            Käyttäjänimi = $u.Name
            KokoNimi     = $u.FullName
            Ryhmät       = $groups
            LastLogon    = $lastLogon
        }
    } catch {
        Write-Warning "Virhe käyttäjän $($u.Name) kohdalla: $_"
    }
}

# Näytetään tulos taulukkona
$result | Sort-Object Käyttäjänimi | Format-Table -AutoSize

Tässä muokattuna tuo aiemmin jaettu koodi.
Vaihdoin tuon käyttäjävertailun ryhmissä sidiin, jotta tulisi tuloksia varmemmin.
 
Koodi:
# Listaa kaikki paikalliset käyttäjät, jotka eivät ole poistettu käytöstä
$users = Get-LocalUser | Where-Object { -not $_.Disabled }

# Haetaan kaikki ryhmät ja niiden jäsenet etukäteen
$groupMap = @{}
foreach ($group in Get-LocalGroup) {
    try {
        $members = Get-LocalGroupMember -Group $group.Name -ErrorAction SilentlyContinue
        $groupMap[$group.Name] = $members
    } catch {
        $groupMap[$group.Name] = @()
    }
}

# Kerätään tiedot jokaisesta käyttäjästä
$result = foreach ($u in $users) {
    try {
        # Käyttäjän ryhmät SID-tunnisteen perusteella
        $userSID = $u.SID
        $groupList = @()
        foreach ($entry in $groupMap.GetEnumerator()) {
            if ($entry.Value | Where-Object { $_.SID -eq $userSID }) {
                $groupList += $entry.Key
            }
        }
        $groups = $groupList -join ", "

        # Viimeinen kirjautuminen (jos saatavilla)
        $lastLogon = $u.LastLogon
        if (-not $lastLogon) { $lastLogon = "Ei tietoa" }

        # Tulostetaan yhteen objektiin
        [PSCustomObject]@{
            Käyttäjänimi = $u.Name
            KokoNimi     = $u.FullName
            Ryhmät       = $groups
            LastLogon    = $lastLogon
        }
    } catch {
        Write-Warning "Virhe käyttäjän $($u.Name) kohdalla: $_"
    }
}

# Näytetään tulos taulukkona
$result | Sort-Object Käyttäjänimi | Format-Table -AutoSize

Tässä muokattuna tuo aiemmin jaettu koodi.
Vaihdoin tuon käyttäjävertailun ryhmissä sidiin, jotta tulisi tuloksia varmemmin.
Kiitos. Pitää kokeilla toimiiko tuo paremmin. Pystyn tosin jo nyt sanomaan, että tuossa on lähes varmasti yksi ongelma: osalla käyttäjistä on noita ryhmiä jopa parikymmentä ja minun käsittääkseni tuo autosize näyttää niin paljon kun ikkunaan mahtuu. Ikkunaan vaan ei pysty mahtumaan ikinä koko ryhmälitaniaa eli se ei näytä kaikkia. Tuon ei itse asiassa tarvitse olla edes ruutuun tulostettava vaan vaikka csv käy ihan hyvin kunhan se on muodossa jossa sen saa ladattua exceliin tms. nopeasti. Kaikkien ryhmien pitäisi kuitenkin olla näkyvissä
 
Kiitos. Pitää kokeilla toimiiko tuo paremmin. Pystyn tosin jo nyt sanomaan, että tuossa on lähes varmasti yksi ongelma: osalla käyttäjistä on noita ryhmiä jopa parikymmentä ja minun käsittääkseni tuo autosize näyttää niin paljon kun ikkunaan mahtuu. Ikkunaan vaan ei pysty mahtumaan ikinä koko ryhmälitaniaa eli se ei näytä kaikkia. Tuon ei itse asiassa tarvitse olla edes ruutuun tulostettava vaan vaikka csv käy ihan hyvin kunhan se on muodossa jossa sen saa ladattua exceliin tms. nopeasti. Kaikkien ryhmien pitäisi kuitenkin olla näkyvissä
Morjensta,
Tuon vikan rivin voi korvata vaikka:
$result | Export-Csv -Path esim.csv -Encoding UTF8

Tällöin saat pihalle tuon csv:nä.
 
Morjensta,
Tuon vikan rivin voi korvata vaikka:
$result | Export-Csv -Path esim.csv -Encoding UTF8

Tällöin saat pihalle tuon csv:nä.
Jos asentaa ImportExcel moduulin, saa suoraan xlsx muotoon.
$result | Export-Excel -Path c:\polku\users.xlsx -AutoSize -Append
 
Tulee käytettyä lähes päivittäin ja tehtyä kaikenlaisia skriptejä mutta toki BAT/CMD skripteilläkin pääsee jo aika pitkälle mutta tottakai PowerShell taipuu paljon paljon laajempiin kokonaisuuksiin. Esim. paljon AD-ympäristöön liittyviä hakuja ehdoilla X ja Y tulee tehtyä, jossa halutaan tietty käyttäjäporukka hakea AD:lta ja tietyillä hakuehdoilla esim. tittelissä esiinnyttävä sana X tai Y. Käyttökohteet ovat todella laajat ja skriptin kirjoittaminen lähtee yleensä aina jostain tarpeesta tyyliin "kunpa olisi työkalu jolla voisi hakea jotain tai tehdä jotain ja helpottaisi päivittäistä työtä".
 
Powershellissä eniten ikävää että vaikka sillä voi tehdä vaikka ja mitä niin voi leikkiä vain omalla työasemalla. Sitten kun tarviikin suorittaa sama scripti asiakkaan serverillä, niin puuttuu suoritusoikeudet eikä saa tarvittavia moduleja asentaa. Kätevä omassa käytössä mutta duunissa vähän huonompi soveltaa.
Voisiko tästä olla apua sinulle tähän ongelmaan?

 

Statistiikka

Viestiketjuista
295 510
Viestejä
5 048 669
Jäsenet
80 894
Uusin jäsen
normacha

Hinta.fi

Back
Ylös Bottom