When working with Windows machines in a corporate environment, it's crucial to understand your effective permissions and group memberships. Domain-joined computers inherit permissions differently from standalone machines, making role verification more complex.
The simplest way to check your current user's group memberships is through the command prompt:
whoami /groups
For a more detailed view of your security context:
whoami /all
This will display your username, SID, groups (both domain and local), and privileges.
PowerShell provides more comprehensive options. Try this command to see all groups where your user is a member:
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=user)(samAccountName=$env:USERNAME))")).FindOne().GetDirectoryEntry().memberOf
For a cleaner output with just group names:
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=user)(samAccountName=$env:USERNAME))")).FindOne().GetDirectoryEntry().memberOf | % { [System.Text.Encoding]::Default.GetString([System.Convert]::FromBase64String($_)) }
To understand what permissions you actually have on the local machine, use this PowerShell script:
$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object System.Security.Principal.WindowsPrincipal($identity)
# Check for common roles
"Local Administrators: " + $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
"Power Users: " + $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::PowerUser)
"Users: " + $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::User)
Domain users often have rights assigned through Group Policy. To check these:
gpresult /r
Or for more detailed HTML output:
gpresult /h $env:USERPROFILE\Desktop\GPOReport.html
Here's a complete PowerShell function to check both local and domain roles:
function Get-UserRoles {
[cmdletbinding()]
param()
$output = @{}
$identity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object System.Security.Principal.WindowsPrincipal($identity)
# Local machine roles
$output.LocalRoles = @{
Administrator = $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
PowerUser = $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::PowerUser)
User = $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::User)
}
# Domain groups (requires RSAT)
try {
$searcher = New-Object System.DirectoryServices.DirectorySearcher
$searcher.Filter = "(&(objectCategory=user)(samAccountName=$($identity.Name.Split('\')[1])))"
$result = $searcher.FindOne()
if ($result) {
$user = $result.GetDirectoryEntry()
$output.DomainGroups = $user.memberOf | ForEach-Object {
$_.ToString().Split(',')[0].Replace("CN=","")
}
}
}
catch {
Write-Warning "Could not query domain groups: $_"
}
return $output
}
# Usage:
Get-UserRoles | ConvertTo-Json -Depth 3
When working in a Windows domain environment, it's crucial to verify your effective permissions and group memberships. The domain context adds complexity because your access rights can come from:
- Local machine groups
- Domain groups
- Nested group memberships
- Organizational Unit (OU) policies
For a fast check of your current user's group memberships (both local and domain):
whoami /groups
This returns output showing all security groups where your account has membership, including SIDs and attributes like "Mandatory" or "Enabled by default".
For more detailed analysis, use PowerShell:
$currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$currentUser.Groups | ForEach-Object {
$group = $_.Translate([System.Security.Principal.NTAccount])
$groupSid = $_.Value
[PSCustomObject]@{
GroupName = $group.Value
SID = $groupSid
IsDomainGroup = $groupSid -like "S-1-5-21-*"
}
} | Format-Table -AutoSize
To see what permissions you actually have on specific resources:
# For file system permissions
$path = "C:\\SensitiveFolder"
$accessRules = (Get-Acl $path).Access
$accessRules | Where-Object { $_.IdentityReference -eq $env:USERNAME }
# For registry permissions
$regPath = "HKLM:\\Software\\YourApp"
(Get-Acl $regPath).Access | Where-Object {
$_.IdentityReference -eq $env:USERDOMAIN + "\\" + $env:USERNAME
}
Domain users often need to check GPO-applied restrictions:
gpresult /r /scope user
Combine with HTML output for better readability:
gpresult /h $env:USERPROFILE\\Desktop\\GPOReport.html
Here's a comprehensive script that checks multiple permission aspects:
function Get-UserSecurityContext {
param([string]$ComputerName = $env:COMPUTERNAME)
$output = @{
UserName = "$env:USERDOMAIN\\$env:USERNAME"
Computer = $ComputerName
LocalGroups = @()
DomainGroups = @()
Privileges = @()
}
# Get local group memberships
$localGroups = net localgroup | Where-Object { $_ -match "^-+" -replace "-" }
foreach ($group in $localGroups) {
$members = net localgroup $group | Where-Object { $_ -match $env:USERNAME }
if ($members) {
$output.LocalGroups += $group
}
}
# Get domain group memberships
$user = [ADSI]"WinNT://$env:USERDOMAIN/$env:USERNAME"
$groups = $user.Groups()
foreach ($group in $groups) {
$output.DomainGroups += $group.Name
}
# Get privileges
$output.Privileges = whoami /priv | Where-Object { $_ -match "Se" }
return [PSCustomObject]$output
}
Get-UserSecurityContext | Format-List
Case 1: When you see access denied but groups suggest you should have access:
# Check token elevation status [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent() | Select-Object IsInRoleAdministrator
Case 2: When nested group permissions aren't applying:
# Force group policy update gpupdate /force # Refresh security token klist purge