Есть ли способ проверить произвольного участника безопасности на наличие административных прав на локальном сервере с PowerShell? - PullRequest
0 голосов
/ 24 декабря 2018

Во многих примерах в Интернете показан способ проверки текущего пользователя на наличие административных привилегий с использованием

[Security.Principal.WindowsPrincipal]    
[Security.Principal.WindowsIdentity]::GetCurrent()

. Существует ли аналогичный способ проверки не «текущей» идентичности, а какой-либо (локальной или доменной, дляНапример, извлекается из командлета Get-ACL) при выполнении команд на определенном сервере.

Я проверил https://docs.microsoft.com/en-us/dotnet/api/system.security.principal.windowsidentity.-ctor?view=netframework-4.7.2#System_Security_Principal_WindowsIdentity__ctor_System_String_,, но не смог найти способ сделать это (только если вы используете конструктор с параметром UPN, что не подходит в моем случае).Буду признателен за любую подсказку.

1 Ответ

0 голосов
/ 24 декабря 2018

Вы можете попробовать следующую функцию, которая для данного имени пользователя:

  • пытается найти базовый идентификатор (учетная запись пользователя NT) в том же контексте, что и вызывающий пользователь (домен противместный);имя пользователя может быть указано в нескольких форматах, в том числе в формате NTLM (<domain>\<username>).
  • , а затем проверяет эту идентичность на (статическое) членство во встроенном local Administrators группа.
function Test-LocalAdminGroupMembership {
  param([string] $user)

  # Load the required assembly (a no-op if already loaded).
  Add-Type -AssemblyName System.DirectoryServices.AccountManagement

  # Obtain the specified user as a UserPrincipal instance.
  $up = try {
    if (-not $user) { # default to current user
      [System.DirectoryServices.AccountManagement.UserPrincipal]::Current
    } else {
      [System.DirectoryServices.AccountManagement.UserPrincipal]::FindByIdentity(
        [System.DirectoryServices.AccountManagement.UserPrincipal]::Current.Context,
        $user
      )
    }
  } catch {
    Throw
  }

  # See if the well-known SID of the local Administrators group
  # is among the SIDs of the groups that the user is a member of (PSv3+ syntax).
  $up.GetGroups().SID.Value -contains 'S-1-5-32-544'

}
...