| Někde to tady mám, ale nemůžu to najít a docela často to potřebuju, takže znovu :-)
Úkol zní - vylistovat všechny loginy z Active Directory (ADDS) za použití minimálních oprávnění a tak, aby to pokud možno šlo kdykoliv. A ono to jde. Bez ohledu na oprávnění, která máte na objektech a organizačních jednotkách v AD, tahle metoda funguje pod jakýmkoliv ověřeným účtem vždy. Protože nepoužívá LDAP připojení, ale nechává si pomocí SAM rozhraní překládat SIDy na loginy. Takže stačí libovolný účet, který je Authenticated Users.
Jak to funguje? Každý účet, účet počítače, nebo skupina má SID. Všechny SIDy v jedné doméně jsou stejné, kromě koncovky (RID). RIDy vznikají tak, že se pouze inkrementují pro každý nový účet. Stačí tedy nechat si přeložit všechny SIDy od 1 do 2 miliard :-) Samozřejmě skončíte jakmile cítíte, že tam už žádné další nebudou.
function global:Get-PrimaryDomainSID ()
{
# Note: this script obtains SID of the primary AD domain for the local computer. It works both
# if the local computer is a domain member (DomainRole = 1 or DomainRole = 3)
# or if the local computer is a domain controller (DomainRole = 4 or DomainRole = 4).
# The code works even under local user account and does not require calling user
# to be domain account. This should also work on any AD domain regardless of language
# mutation because, hopefully, the krbtgt account has always the same name
[string] $domainSID = $null
[int] $domainRole = gwmi Win32_ComputerSystem | Select -Expand DomainRole
[bool] $isDomainMember = ($domainRole -ne 0) -and ($domainRole -ne 2)
if ($isDomainMember) {
[string] $domain = gwmi Win32_ComputerSystem | Select -Expand Domain
[string] $krbtgtSID = (New-Object Security.Principal.NTAccount $domain\krbtgt).Translate([Security.Principal.SecurityIdentifier]).Value
$domainSID = $krbtgtSID.SubString(0, $krbtgtSID.LastIndexOf('-'))
}
return $domainSID
}
$domainSID = Get-PrimaryDomainSID
(500..10000) | % {
$user = New-Object Security.Principal.SecurityIdentifier $domainSID-$_
$errorActionPreference = 'SilentlyContinue'
$user.Translate([Type]::GetType('System.Security.Principal.NTAccount')).Value
$errorActionPreference = 'Continue'
}
|