mirror of
https://github.com/Kevin-Robertson/Powermad
synced 2026-06-08 11:28:52 +00:00
4934f19aae
Added the ability to accept creds for all of the machine account scripts. Also syncing Invoke-DNSUpdate with version that is currently in the Inveigh dev branch.
154 lines
5.1 KiB
PowerShell
154 lines
5.1 KiB
PowerShell
function Get-MachineAccountCreator
|
|
{
|
|
<#
|
|
.SYNOPSIS
|
|
This function leverages the ms-DS-CreatorSID property on machine accounts to return a list
|
|
of usernames or SIDs and the associated machine account. The ms-DS-CreatorSID property is only
|
|
populated when a machine account is created by an unprivileged user. Note that SIDs will be returned
|
|
over usernames if SID to username lookups fail through System.Security.Principal.SecurityIdentifier.
|
|
|
|
.DESCRIPTION
|
|
This function can be used to see how close a user is to a ms-DS-MachineAccountQuota before
|
|
using New-MachineAccount.
|
|
|
|
Author: Kevin Robertson (@kevin_robertson)
|
|
License: BSD 3-Clause
|
|
|
|
.PARAMETER Credential
|
|
Credentials for LDAP.
|
|
|
|
.PARAMETER DistinguishedName
|
|
Distinguished name for the computers OU.
|
|
|
|
.PARAMETER Domain
|
|
The targeted domain. This parameter is mandatory on a non-domain attached system. Note this parameter
|
|
requires a DNS domain name and not a NetBIOS version.
|
|
|
|
.PARAMETER DomainController
|
|
Domain controller to target. This parameter is mandatory on a non-domain attached system.
|
|
|
|
.EXAMPLE
|
|
Get-MachineAccountCreator
|
|
|
|
.EXAMPLE
|
|
$user_account_password = ConvertTo-SecureString 'Spring2018!' -AsPlainText -Force
|
|
$user_account_creds = New-Object System.Management.Automation.PSCredential('domain\user',$user_account_password)
|
|
Get-MachineAccountCreator -Credential $user_account_creds
|
|
|
|
.LINK
|
|
https://github.com/Kevin-Robertson/Powermad
|
|
#>
|
|
|
|
[CmdletBinding()]
|
|
param
|
|
(
|
|
[parameter(Mandatory=$false)][String]$DistinguishedName,
|
|
[parameter(Mandatory=$false)][String]$Domain,
|
|
[parameter(Mandatory=$false)][String]$DomainController,
|
|
[parameter(Mandatory=$false)][System.Management.Automation.PSCredential]$Credential
|
|
)
|
|
|
|
if(!$DomainController)
|
|
{
|
|
|
|
try
|
|
{
|
|
$DomainController = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().DomainControllers[0].Name
|
|
}
|
|
catch
|
|
{
|
|
Write-Output "[-] domain controller not located"
|
|
throw
|
|
}
|
|
|
|
}
|
|
|
|
if(!$Domain)
|
|
{
|
|
|
|
try
|
|
{
|
|
$Domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain().Name
|
|
}
|
|
catch
|
|
{
|
|
$error_message = $_.Exception.Message
|
|
$error_message = $error_message -replace "`n",""
|
|
Write-Output "[-] $error_message"
|
|
throw
|
|
}
|
|
|
|
}
|
|
|
|
if(!$DistinguishedName)
|
|
{
|
|
$distinguished_name = "CN=Computers"
|
|
$DC_array = $Domain.Split(".")
|
|
|
|
ForEach($DC in $DC_array)
|
|
{
|
|
$distinguished_name += ",DC=$DC"
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
$distinguished_name = "$DistinguishedName"
|
|
}
|
|
|
|
Write-Verbose "[+] Distinguished Name=$distinguished_name"
|
|
|
|
try
|
|
{
|
|
|
|
if($Credential)
|
|
{
|
|
$directory_entry = New-Object System.DirectoryServices.DirectoryEntry("LDAP://$DomainController/$distinguished_name",$Credential.UserName,$credential.GetNetworkCredential().Password)
|
|
}
|
|
else
|
|
{
|
|
$directory_entry = New-Object System.DirectoryServices.DirectoryEntry "LDAP://$DomainController/$distinguished_name"
|
|
}
|
|
|
|
$machine_account_searcher = New-Object DirectoryServices.DirectorySearcher
|
|
$machine_account_searcher.SearchRoot = $directory_entry
|
|
$machine_accounts = $machine_account_searcher.FindAll() | where-object {$_.properties.objectcategory -match "CN=computer"}
|
|
$creator_object_list = @()
|
|
|
|
ForEach($account in $machine_accounts)
|
|
{
|
|
$creator_SID_object = $account.properties."ms-ds-creatorsid"
|
|
|
|
if($creator_SID_object)
|
|
{
|
|
$creator_SID = (New-Object System.Security.Principal.SecurityIdentifier($creator_SID_object[0],0)).Value
|
|
$creator_object = New-Object PSObject
|
|
|
|
try
|
|
{
|
|
$creator_username = (New-Object System.Security.Principal.SecurityIdentifier($creator_SID)).Translate([System.Security.Principal.NTAccount]).value
|
|
Add-Member -InputObject $creator_object -MemberType NoteProperty -Name Creator $creator_username
|
|
}
|
|
catch
|
|
{
|
|
Add-Member -InputObject $creator_object -MemberType NoteProperty -Name Creator $creator_SID
|
|
}
|
|
|
|
Add-Member -InputObject $creator_object -MemberType NoteProperty -Name "Machine Account" $account.properties.samaccountname[0]
|
|
$creator_object_list += $creator_object
|
|
$creator_SID_object = $null
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
catch
|
|
{
|
|
$error_message = $_.Exception.Message
|
|
$error_message = $error_message -replace "`n",""
|
|
Write-Output "[-] $error_message"
|
|
throw
|
|
}
|
|
|
|
Write-Output $creator_object_list | Sort-Object -property @{Expression = {$_.Creator}; Ascending = $false}, "Machine Account" | Format-Table -AutoSize
|
|
} |