2019-11-01

Windows'da kapanma olaylarının takibi

Beklenmeyen kapanma. En çok merak edilen konulardan birisi. Evde veya işte, kişisel bilgisayar veya sunucu. Soru hep aynı. Neden kapanmış?

Aşağıdaki olayları bilgisayarın açılış ve kapanış saatlerini ve hatta nedenlerini görüntülemek için kullanabiliriz (hepsi System evenlog'da).

Event ID Source Message
6005EventlogThe Event log service was started.
6006EventlogThe Event log service was stopped.
6008EventlogThe previous system shutdown at <date time> was unexpected.
6009EventlogMicrosoft (R) Windows (R) 10.00. 19042 Service Pack 1 Multiprocessor Free.
(Sistemin açışında sürüm bilgisinin kaydını düşen bir olay. 6005, 6006 ve 6009 olayları aynı anda kayda düşmüş gibi gözükür)
6013EventlogThe system uptime is <seconds> seconds.
(Aslında açılış ve kapanışla ilgisi yok, sistemin kaç saniyedir açık olduğunu bildiren periyodik bir kayıt)
1074User32The process <process> (<computer>) has initiated the power off of computer <computer> on behalf of use
 <username> for the following reason: Other (Unplanned)
12Kernel-GeneralThe operating system started at system time <date time>
13Kernel-GeneralThe operating system is shuting down at system time <date time>
109Kernel-PowerThe kernel power manager has initiated a shutdown transition.
107Kernel-PowerThe system has resumed from sleep. (fast boot etkin olan Windows 10 sistemlerde kapanma yerine)
1Kernel-GeneralThe system time has changed to <datetime> from <datetime>.
Change Reason: System time synchronized with the hardware clock. (fast boot etkin olan Windows 10 sistemlerde açılma yerine)
42Kernel-PowerThe system is entering sleep.
Sleep Reason: Application API
41Kernel-PowerThe system has rebooted without cleanly shutting down first. This error could be caused if the system stopped responding, crashed, or lost power unexpectedly.
1Power Troubleshooter    
The system has returned from a low power state.
Sleep Time: ...
Wake Time: ....... (42/Kernel-Power olayı ile düşük güç moduna girmek ve bu olayla çıkmak)
19WindowsUpdateClientInstallation Successful: Windows successfully installed the following update... (tekrar başlatma gerekmeyen durumlarda)
20WindowsUpdateClientInstallation Failure: Windows failed to install the following update...
21WindowsUpdateClientRestart Required: To complete the installation of the following updates, the computer must be restarted. Until this...
22WindowsUpdateClientRestart Required: To complete the installation of the following updates, the computer will be restarted within 15 minutes...
27WindowsUpdateClientAutomatic Updates is now paused. (güncelleştirmelerin ardından yeniden başlatılana kadar hizmet durdurulur)
43WindowsUpdateClientInstallation Started: Windows has started installing the following update...
44WindowsUpdateClientWindows Update started downloading an update.
26Application PopupBir uygulamanın hata verdmesi veya kaldırılması sebebiyle tekrar başlatma gerektiğini bildiren çeşitli mesajlar    
1000    
Application Error

Bir uygulama beklenmeyen bir şekilde kapandığında. (bu olay Application Event Log'a yazılır)

Hatalı uygulama adı: dwm.exe, sürüm: 10.0.26100... 

1002Application Hang

Bir uygulama yanıt vermeyi bıraktığında. (bu olay Application Event Log'a yazılır)

0.0.0.0 sürümlü cs2.exe programı Windows ile etkileşimi durdurdu ve kapatıldı.



İlk 3 sırada listelenen 6005, 6006 ve 6008 olaylarının kaynağı neden eventlog? Çünkü bilgisayar düzgün bir şekilde başlatılırken ilk başlayan hizmet eventlog, düzgün kapanırken de en son durdurulan hizmet de eventlog hizmetidir. Ancak çalışma süresi boyunca bu hizmetler durdurulup tekrar başlatılabileceği için dikkatli davranmak gerekebilir.

Beklenmeyen bir kapanmayı (güç kesintisi, donanım arızası gibi) ile ilgili 6008/Eventlog, 1024/User32 ve 41/Kernel-Power olayları aranabilir.

Son 2 satırda yer alan 21/Windows Update Agent ve 26/Application Popup olayları ise tekrar başlatmanın kendisine değil, muhtemel sebebine dair bir bilgi içerebilir.

Powershell Get-WinEvent kullanarak sorgularken ProviderName olarak WindowsUpdateClient yerine ya "Microsoft-Windows-WindowsUpdateClient" yazmak, ya da "*WindowsUpdateClient" şeklinde wildcard kullanmak gerekir. Örneğin:
Get-WinEvent -ComputerName <bilgisayar> -FilterHashTable @{LogName="System";ProviderName="*WindowsUpdateClient"} -MaxEvents 10

Birkaç olay ID'sini ve sağlayıcı ismini bir arada kullanarak şu şekilde bir komut son 10 günde olup bitene göz atmak için faydalı olabilir.

Get-WinEvent -FilterHashTable @{LogName="System";ProviderName=("Microsoft-Windows-WindowsUpdateClient","User32","Microsoft-Windows-Kernel-General");Id=12,13,19,20,21,22,43,44,1074;StartTime=(Get-Date).AddDays(-10)} |Select TimeCreated, Id, Message |Format-Table -AutoSize -Wrap

Event ID'leri ile sınırlamadan, örneğin son 2 saatteki geniş bir olay zincirini incelemek için

Get-WinEvent -FilterHashTable @{LogName="System";ProviderName=("Microsoft-Windows-WindowsUpdateClient","User32","Microsoft-Windows-Kernel-General","Microsoft-Windows-Kernel-Power","Microsoft-Windows-Power-Troubleshooter");StartTime=(Get-Date).AddHours(-2)} |Select TimeCreated, Id, Message |Format-Table -AutoSize -Wrap

2019-10-31

KDE Plasma'da uygulamalar için açılışta başlama seçenekleri

KDE5 Plasma'da bir uygulamam bilgisayar her açıldığında otomatik başlıyordu. Sistem Ayarları>Başlatma ve Kapatma kısmında ya da ~/.config/autostart klasörünün altında bir giriş bulamadığım için bu uygulamanın nasıl her seferinde tekrar başladığını merak ettim. Biraz araştırdığımda şu linkte buldum ki bu arkadaş için otomatik başlamayı mümkün kılan şey, /usr/share/applications klasörü altında yaratılmış olan .desktop uzantılı bir dosyaymış. Bunu da buraya not etmiş olmak istedim.

Başka bir  autostart konumu da /etc/xdg/autostart (dnfdragora-updater buradan çalışıyor).

Şu adreste verildiğine göre tüm otomatik başlangıç konumlarının bir listesi şöyle olabilir:

~/.kde/Autostart
~/.kde/share/autostart
~/.config/autostart
~/.local/share/autostart
/etc/xdg/autostart
/usr/share/autostart

2019-10-22

Yeni WSUS sunucuya bağlanı sorunu

Mevcut WSUS sunucumuzu kaldırıp yerine yeni bir WSUS sunucu kurduk. Windows Workstation bilgisayarımda RSAT yüklüydü. Ama WSUS Administration Console'u açınca hata verip çıkıyordu. Sebebi eski WSUS sunucuyu bulamaması, yeni WSUS sunucunun da adını bilmemesi. Acaba benim bilgisayarımdaki WSUS MMC snap-in'ini nasıl sıfırlayabilirim diye düşünürken şu adreste verilen çözüm işime yaradı.
%appdata%\Microsoft\MMC
klasörünün altındaki wsus dosyasını silip Administration Console'u yeniden başlatınca bana tekrar yeni sunucunun adını sordu, girdim ve herşey normale döndü.

Windows komut satırı işleri

Linux'taki chown komutunun Windows'daki eşdeğeri takeown.exe. Bu araç ile komut satırından bir dosya veya klasörün, alt klasör ve dosyalarıyla birlikte sahipliğini alabiliriz. Örnek kullanım:
takeown /F <hedef> /r /d e
Burada:
/F <hedef> ile sahipliği alınacak dosya veya klasör olmalı.
/r hedefin bir klasör olması durumunda recursive olarak alt öğelerin de sahipliğinin alınması için
/d bir alt klasörde listeleme izni olmaması durumunda devam etmek için Y (veya Türkçe sistemlerde E), bu işlemi atlamak için N (veya Türkçe sistemlerde H)
Burada büyük küçük harf hassasiyeti yok, H ve h aynı.

Bir klasörü altındaki tüm öğelerle silmek için
del /f /q /s <hedef>

Buradaki
/f ile salt okunur dosyaları silmeye zorla
/q ile sessiz çalış, her silme işlemi için onay isteme!
/s altklasörleri de (subfolders) sil

Bir başka yöntem

 rmdir /s /q <hedef>

2023-09-13 Ek: Nokta ile biten bir dosyayı normal yöntemlerle silmek mümkün olmayabiliyor. Örneğin 

D:\Klasor\dosya1. 

gibi bir dosyamız varsa silmek için şu yol önerilmiş:

del "\\?\D:\Klasor\dosya1."

2019-10-17

Word'de Regular Expression ile bul ve değiştir

Varsayalım ki bir belgemiz var ve bu belgenin içinde tarihler 2019-10-17 şeklinde yazılmış. Biz bu belge içinde geçen bütün bu tarihleri 17.10.2019 şekline dönüştürmek istiyoruz. Bunlar çok sayıda olduğu için elle yapmadan, otomatik olarak yapmak istiyoruz. Bunun için Ctrl+H ile Word'ün bul ve değiştir diyaloğunu açmalı, özel karakterler (Use Wildcards) işaret kutusunu (checkbox) işaretlemeliyiz.

Bulunacak kelime kutusuna şu şekilde bir giriş yapmalıyız:
[0-9]{4}\-[0-9]{2}\-[0-9]{2}
Burada kırmızı ile yazılan ilk bölüm, 4 haneli bir sayıyı (yıl), mavi ve yeşil ile yazılan ikinci ve üçüncü bölümler de iki haneli sayıları (sırasıyla ay ve gün) bulmak için. Amacımız ayın gününü başa, yılı sona getirmek olduğu için bulunan bu tarih alanlarını bölümlere ayırmamız gerek. Bu amaçla parantezleri kullanacağız. Her parantez içi, 1'den başlayarak artan sayılarla ilişkilendirilecek. Bunun sonucunda aşağıdaki gibi ilk bulunan 4 haneli yılı gösteren sayı 1 sayısıyla, ikinci bulunan iki haneli ayı gösteren sayı 2 sayısıyla, ve sondaki ayın gününü gösteren iki haneli sayı da 3 sayısıyla ilişkilendirildi.
([0-9]{4})\-([0-9]{2})\-([0-9]{2})
 --------    --------    --------
     \1         \2          \3
Ve nihayetinde değiştirme kutusuna da şunları yazmamız gerekecek:

\3.\2.\1
Bu şekilde 3. sırada bulunan ayın gününü ilk başa, ayı ortaya ve 1. sırada bulunan yılı en sona yazıp, bunları noktalarla ayırmayı seçmiş oluyoruz.

2019-10-08

Powershell komut satırını özelleştirme

Her kabuk (shell) penceresinde olduğu gibi Powershell'de de uzunca satır çıktı üreten komutlar sonrasında komutların yazıldığı satırlar ile çıktılar birbirine karışabilir. Bunu önlemenin basit bir yolu komut satırlarını renklendirmek olabilir. Örnek olarak bu çalışmanın yapılmadığı bir Powershell penceresinde çıktı şu şekilde olur:


Ve uygun düzenlemeler sonrasında şu şekilde:


Satır genişliğindeki değişme, bu düzenlemeler sonucunda değil, bu kısmı göz ardı edelim. Odaklanmamız gereken Get-ChildItem ile başlayan satırdaki renklenme. Bunu sağlamak için öncelikle profile.ps1 dosya şu şekilde bir prompt fonksiyonu ekledim:

function Prompt
{
    $promptString = "PS " + (Get-Date -Format t) + " " + $(Get-Location) + ">"
    Write-Host $promptString -NoNewline -ForegroundColor Cyan
    return " "

}

Bunun sonucunda PS kısaltmasından hemen sonra saat ve dakikayı içeren saat bilgisi, ve dosya sistemindeki mevcut konumumu gösteren klasör yolunu renkli olarak aldım. Profile.ps1 dosyasının konumu da Belgelerim klasörümün içinde WindowsPowershell klasörünün içinde olmalıdır. Belgelerim klasörümün konumunu öğrenmek için
PS> [environment]::getfolderpath("mydocuments")
yazabilirim.

Burada yaptığım bir renklendirme de Windows 10 ile varsayılan olarak yüklü gelen PSGallery modülü PSReadLine'ı yüklemek oldu. Bunun sonucunda cmdlet'ler ile parametrelerim farklı renkli görünmeye başladı. Ayrıca kapatılmamış bir tırnak veya parantez varsa prompt'un sonundaki '>' işaretinin de rengi kırmızıya dönüşüyor. Görsel olmayan bir büyük fark da klavye kısayollarının gelmesi. cmd.exe'de var olmayan son kelimeyi silme kısayolu olarak Ctrl+Backspace varsayılan ataması geliyor. Değiştirmek için
Set-PSReadLineKeyHandler -Chord Ctrl+w -Function BackwardDeleteWord
gibi atamalar kullanılabilir.

PSReadline modülünün bir güzelliği de pencereler kapatılsa bile silinmeyen bir komut geçmişine (history)  sahip olması. Bu komut geçmişini
Get-PSReadlineOption

cmdlet'inin çıktısındaki HistorySavePath değişkeninde bulabiliriz. İlginç olan yukarı ve aşağı ok tuşlarıyla komut geçmişinde gezinmek mümkün, ama Get-History ile bu geçmişi göremiyoruz. Eğer Get-History / Invoke-History gibi komutları kullanmayı tercih ediyorsak PSReadlineHistory modülünü yükleyerek bu iki komutun eşdeğeri olan Get-PSReadlineHistory / Invoke-PSReadlineHistory gibi komutlara sahip olabiliriz. İleride bizi bekleyen bir sorun; komut geçmişinin binlerce satırdan oluşması. Bu durumda shell penceresinin açılışı çok uzun sürebilir. Bu durumlar için geliştirilen cmdlet Optimize-PSReadlinehistory. Komut geçmişinin boyutu sınırlandırılabilir, belli bir karakterden uzun olmayan komutlar silinebilir, ya da tekrarlayan komutlardan kurtulunabilir. Komut geçmişi de 

%appdata%\Microsoft\Windows\Powershell\PSReadLine\ConsoleHost_history.txt 

dosyasında saklanır, doğrudan müdahale etmek istenirse.

BONUS: Açılan pencerenin yönetici olarak açılıp açılmadığını başlık çubuğunda yazan Administrator kelimesinden anlayabiliriz. Ama ayrıca komut satırında da bununla ilgili bir belirteç görmek istersek bu ayrımı yapabilmek için şu yöntem kullanılabilir:

if ((whoami /all | select-string S-1-16-12288) -ne $null
{
     Write-Host "#" -ForegroundColor White -BackgroundColor DarkGreen -NoNewline
}
else
{
    Write-Host ">" -ForegroundColor Green -NoNewline
}
Bu şekilde yönetici ayrıcalıklarıyla açılan pencerenin komut satırında koyu yeşil fon üzerine beyaz bir # işareti, normal kullanıcı yetkileriyle açılanda ise yeşil bir > işareti görüntülenebilir.

Şu sayfadaki
if ((New-Object Security.Principal.WindowsPrincipal(
[Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator))
{
  Write-Output "Elevated."
}
else
{
  Write-Output "Not elevated."
}

örneği gibi başka alternatifler de var. Kırmızı ile yazılan if satırı bölünmeden tek satır olmalı, ya da uygun bir bölme yöntemi ile bölünebilir.

Ek 2020-07-29: Windows 8.1 üzerinde sorun yaşamadım ama aynı yapılandırma ile Windows 10 üzerinde ufak bir sorunum vardı. PSReadLine ile gelen ve komut satırında eksik bir tırnak veya parantez olması durumunda ">" işaretini kırmızı yapan özellik çalışmıyordu. Sonradan anladım ki bunu sağlamak için Prompt fonksiyonunun içine

Set-PSReadLineOption -PromptText "> "

eklenmeli.

2021-12-27 ek: Windows Terminal ve özel karakterler (glyph) desteği olan bir font, örneğin Cascaydia Nerd Font gibi, bir font yüklü olduğunu varsayarak aşağıdaki gibi bir Prompt fonksiyonu fena olmuyor.

function Prompt
{
    $clockGlyph = [char]0x23F0
    $hourglassGlyph = [char]0x23F3
    $winlogo = [char]0xE70F
    
    Write-Host "$clockGlyph"(Get-Date -Format "(dd, dddd) HH:mm") " " -ForegroundColor Red -BackgroundColor White -NoNewline
    if ((Get-History).Length -gt 0)
    {
        $LastExecutionTime = "{0:N0}" -f ((Get-History)[-1].EndExecutionTime - (Get-History)[-1].StartExecutionTime).TotalMilliSeconds
    }
    else
    {
        $LastExecutionTime = "0"
    }
    Write-Host "$hourglassGlyph $LastExecutionTime ms " -ForegroundColor Red -BackgroundColor Yellow -NoNewLine
    Write-Host (Get-Location) -ForegroundColor Cyan
    Set-PSReadLineOption -PromptText "$winlogo > "
    Write-Host "$winlogo >" -NoNewline
    # if required to diplay path in the title bar:
    # $host.ui.rawui.WindowTitle = (Get-Location)
    return " "
}
 

2023-05-18 ek: Tebdil-i terminalde ferahlık vardır;

oh-my-posh kullanmayan bir terminal yapmak istedim. İki satırlık bir prompt, uzun komutlarda ekrana sığması açısından faydalı oluyor. Solda bulunduğumuz klasörün tam yolunu yazan, sağda ise batarya durumumuzla tarih ve saati yazan, ikinci satırda ise bir önceki işlemin ne kadar sürdüğünü (ekran görüntüsünde 10ms'den az olduğu için gözükmemiş), eğer yükseltilmiş yetkilerle açılmış bir terminal penceresi ise bir pacman canavarı ile bunu belirten ve sonrasında prompt karakterlerini gösteren bir prompt fonksiyonunu şu şekilde özelleştirdim:

function Prompt
{
    $prompt_path = Get-Location
    $prompt_right = Get-Date -Format " dd, ddd | HH:mm "
    $winlogo = [char]0xE70F
    $prompt_char = [char]0x276f
    $elevated = [char]0xF79F

    $battery = gcim Win32_Battery
    $BatteryGlyph = ""

    if ($battery.Status -ne "OK") { $BatteryGlyph = [char]0xf12a }

    if ($battery.BatteryStatus -eq 1) { $BatteryGlyph += [char]0xf063 }
    elseif ($battery.BatteryStatus -eq 2) { $BatteryGlyph += [char]0xf062 }

    if ($battery.EstimatedChargeRemaining -ge 80) { $bcolor = "green"}
    elseif ($battery.EstimatedChargeRemaining -ge 50) { $bcolor = "cyan"}
    elseif ($battery.EstimatedChargeRemaining -gt 30) { $bcolor = "blue"}
    else { $bcolor = "red"}
    $prompt_battery = "[$BatteryGlyph $($battery.EstimatedChargeRemaining)] "

    # leftmost: Path
    Write-Host $prompt_path -ForegroundColor Cyan -NoNewline
    $current_Y = [Console]::CursorTop
    $console_width = [Console]::BufferWidth
    [Console]::SetCursorPosition($console_width-($prompt_battery.Length + $prompt_right.length + 1),$current_Y)

    # Rightmost: Battery + date&time
    Write-Host $prompt_battery -ForegroundColor $bcolor -NoNewline
    Write-Host $prompt_right -ForegroundColor Gray -BackgroundColor DarkMagenta

    if ((Get-History).Length -gt 0)
    {
        $LastExecutionTime = [long]((Get-History)[-1].EndExecutionTime - (Get-History)[-1].StartExecutionTime).TotalMilliSeconds
    }
    else
    {
        $LastExecutionTime = "0"
    }

    if ($LastExecutionTime -gt 3600000) {
        $LastExecutionTime = $LastExecutionTime/3600000
        $Duration = "{0:n1}" -f $LastExecutionTime
        $Duration = "($Duration hour) "
    }
    elseif ($LastExecutionTime -gt 60000) {
        $LastExecutionTime = $LastExecutionTime/60000
        $Duration = "{0:n1}" -f $LastExecutionTime
        $Duration = "($Duration min) "
    }
    elseif ($LastExecutionTime -gt 2000)
    {
        $LastExecutionTime = $LastExecutionTime/1000
        $Duration = "{0:n1}" -f $LastExecutionTime
        $Duration = "($Duration sec) "
    }
    elseif ($LastExecutionTime -gt 10) {
        $Duration = "($LastExecutionTime ms) "
    }
    else { $Duration ="" }
   
    # second line: elevation + duration + prompt
    if ((New-Object Security.Principal.WindowsPrincipal(
        [Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(
        [Security.Principal.WindowsBuiltInRole]::Administrator))
        {
            Write-Host "$elevated " -ForegroundColor White -BackgroundColor Red -NoNewline
            Write-Host "$Duration" -ForegroundColor Magenta -NoNewline
            Write-Host "$winlogo $prompt_char" -ForegroundColor White -NoNewline
        }
    else {
        Write-Host "$Duration" -ForegroundColor Magenta -NoNewline
        Write-Host "$winlogo $prompt_char" -ForegroundColor White -NoNewline
    }

    Set-PSReadLineOption -PromptText "$winlogo $prompt_char "

    # if required to diplay path in the title bar:
    $host.ui.rawui.WindowTitle = (Get-Location)
    return " "
}


---
https://docs.microsoft.com/en-us/powershell/module/psreadline/?view=powershell-6

2019-09-16

Linux komut satırından kullanıcı yönetimi

Yeni kullanıcı oluşturmak için:
# useradd  <username>
Bu şekilde /etc/passwd dosyasına aşağıdaki gibi bir satır eklenir:

username:x:user-id:group-id:userinfo:homedirectory:shell

Her ne kadar dosyanın adı passwd olsa da parolalar x ile gösterilir. useradd komutu varsayılan olarak etkinleştirilmemiş bir kullanıcı yaratır. Etkinleştirmek için kullanıcı parolası değiştirimelidir:
# passwd <username>
Daha fazla veri ile kullanıcı yaratmak için
# useradd -m # home klasörünü yarat
          -d /data/projects # home klasörünün konumunu
          -c "Tam Adı" # kullanıcının tam adı
          -e 2019-10-01 # hesap son kullanma tarihi, ya da -f 45 ile kaç gün kullanılabileceği
          -G webadmin,powerusers # kullanıcının üye olacağı grupları
          -g developers # birincil üye olacağı grup

          <username> kullanıcı adı
Yaratılan hesabın kullanıcı ve grup ID'lerini görmek için
# id
uid=1015(username) gid=1039(developers),...
Aynı amaçla kullanılabilecek, bu bilgileri anahtarlarla değil, sorulara verilecek yanıtlarla girebileceğimiz benzer bir komut daha var:
#  adduser <username>

Ya da birden fazla kullanıcıyı bir dosyadan bakarak yaratmak için
# newusers kullanicilar
kullanicilar dosyasının içinde şunun gibi satırlar olmalı:

ahmet:HcZ600a9:1008:1000:Ahmet Özhan:/home/ahmet:/bin/bash


Var olan bir kullanıcı hesabını silmek için
# userdel <username>
Bu komut ile kullanılabilecek bazı anahtarlar:

-r: home klasörünü de sil
-f: sahibinin <username> olmadığı da silmeye zorla
-Z: tüm SELinux bağlantılarını kaldır

Silme öncesinde kullanıcının sahibi olduğu dosyaları aramak için
# find /mnt/shared -user <username> -print
Hatta bulunan dosyaların sahibini değiştirmek için
# find /mnt/shared -user <username> -exec chown mehmet:mehmet {} \;
userdel komutuna alternatif de deluser var:
# deluser <username> -force # silmeye zorla
-remove-home # home klasörünü de sil
-remove-all-files # tüm dosyalarını sil
-backup-to /backup/2018 # silmeden önce yedeğini /backup/2018'e al
Bir grup yaratmak için
# groupadd muhendislik
Bu komut da /etc/groups dosyasına aşağıdaki gibi bir satır ekler

muhendislik:x:1009:

Bir kullanıcıyı bu grubun üyesi yapmak için
# usermod -aG muhendislik ahmet
ya da (kullanıcı ve grup isimlerinin yer değiştirdiğine dikkat!)
# gpasswd -a ahmet muhendislik
Grubu silmek için
# groupdel muhendislik
Kullanıcımızın üyesi olduğu tüm grupların listesini almak için
$ groups

Ya da oturum açmış kullanıcıdan başka bir kullanıcının üye olduğu grupları görmek için 

$ groups ahmet 

Kullanıcıyı grup üyeliğinden çıkarmak için

# gpasswd -d ahmet muhendislik
Kullanıcıyı grubun yöneticisi yapmak için
# gpasswd -A ahmet muhendislik

2023-07-17 Ek: Linux'ta bir kullanıcının admin yetkilerine sahip olması, sudo veya wheel gruplarına üye olması ile mümkün olur. Debian ve türevlerinde sudo grubu üyeliği, Fedora ve CentOS ailesinde ise wheel grubu ile. Ahmet adlı bir kullanıcıyı admin yapmak için örneğin Fedora'da

    # usermod -aG wheel ahmet 

ya da Debian tüvevlerinde bir kullanıcının admin olup olmadığını sorgulamak için 

    # id ahmet

komutunun çıktısında sudo grubunun varlığını kontrol etmek gerek.

2024-08-25 Ek: Bir grubun kullanıcılarını sorgulamak için de (örneğin libvirt grubunun üyelerini)

getent group libvirt