现在,在我开始之前,我会告诉你一个秘密:这是在域控制器上。 *
*由于无关紧要,上述声明受到影响,因为本地管理员帐户和本地管理员组(在此问题的上下文和范围内)发生的唯一重大更改很小,并且不会改变结果足以要求差异化。
我没有在任何其他服务器上遇到这种麻烦,我愿意下注背后的原因是因为它是在DC 秒> *
*与上述相同的原因。接受的答案解释了不一致性,并且是我的疏忽,而不是Windows安全或域控制器的体系结构(读取功能)。
我一直在讨论如何检查是否从本地管理员帐户调用脚本,或者至少是由属于本地管理员组的帐户调用的一些想法
我已重命名本地管理员帐户,但是,我知道我可以通过输入以下内容查看本地管理员帐户是否已调用该脚本:
(New-Object System.Security.Principal.NTAccount('reserved')).Translate([System.Security.Principal.SecurityIdentifier]).Value
我可以看到SID是否以-500
结尾。
通过输入以下命令运行条件以查看调用帐户是否属于Administrators组(范围较大)时,会出现问题:
PS> [bool](([System.Security.Principal.WindowsIdentity]::GetCurrent()).Groups -match "S-1-5-32-544")
PS> False
快速查看其使用的帐户:
PS> $env:username
PS> reserved
或不必要的复杂方式(虽然我有时喜欢它):
PS> Write-Host ((Get-WmiObject Win32_Account | ?{$_.SID.Substring($_.SID.Length-4,4) -eq '-500'}).Caption).Split("\",2)[1] -fore GREEN
PS> reserved
我甚至输入:
PS> net user reserved
它告诉我Local Group Memberships *Administrators
。
我拉出ADUC(dsa.msc
)并查看Builtin
容器,然后双击Administrators组。我选择了会员标签并且看,reserved
实际上是会员!
所以,回顾一下:
通过输入net user reserved
,我能够验证它是本地管理员组的一部分
我查看ADUC并验证保留是内置管理员组的成员
我确保保留的确是本地管理员帐户,方法是验证以S-1-5...
开头并以...-500
为了更进一步,我确保SID与名为"管理员"的Active Directory组匹配。输入Get-ADGroup -Identity "Administrators"
。然后我输入Get-ADGroupMember -Identity "Administrators"
并确保列出了reserved
(这是和SID匹配的!)。
当我检查是否在该帐户的组中找到了众所周知的管理员组SID时(通过获取当前的Windows身份),它表示它不是。
是什么给出了?
为什么我得到的所有迹象表明它实际上是本地管理员组的成员,但在帐户的组中找不到SID?
答案 0 :(得分:1)
将计算机升级为域控制器时,计算机上不再有本地用户或组。成员计算机具有本地用户和组,也可以使用域用户和组进行身份验证,但在DC上,只有域对象。
答案 1 :(得分:0)
我碰巧遇到了什么,我意识到这个问题的答案。为了那些来这里寻求帮助的人,以下是我的问题的答案:
非常简单 - 关于Powershell - 如果管理员组SID(S-1-5-32-544)未显示在用户的组中,那么这是一线指示该脚本未使用管理凭据运行。
例如,当我输入:
([Security.Principal.WindowsIdentity]::GetCurrent()).Groups
我没有看到管理员组SID列出,即使我知道我登录的帐户是管理员组的成员,这意味着当前的Powershell流程没有拥有管理凭证。
如果您点击Run As Administrator
并输入与上述相同的内容,您会看到它在Groups
中列出了管理员组SID。
我遇到不一致的原因仅仅是因为我没有以管理员身份运行Powershell流程。
因此,简而言之,您可以通过几种方法来验证当前的Powershell会话是否具有管理员凭据。第一个是在互联网上无数的网站上找到的并且很常见(我没有没有写这个):
$myWindowsID = [Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal = New-Object Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
if($myWindowsPrincipal.IsInRole($adminRole)) {
\\ TODO: Process is running as Administrator
Clear-Host
} else {
$newProcess = New-Object System.Diagnostics.ProcessStartInfo "Powershell"
$newProcess.Arguments = "& '" + $script:MyInvocation.MyCommand.Path + "'"
$newProcess.Verb = "runas"
[System.Diagnostics.Process]::Start($newProcess)
exit
}
这是另一种方式(我 写了这个):
[Security.Principal.WindowsIdentity]::GetCurrent() | %{
if($_.Groups -contains "S-1-5-32-544") {
\\ TODO: Process is running as Administrator
Clear-Host
} else {
Start Powershell -ArgumentList "& '$MyInvocation.MyCommand.Path'" -Verb runas
exit
}
}
# The Foreach-Object (%) could be replaced with another pipeline filter
我看到很多人都在问这个问题,而且由于Powershell对许多系统管理员很有吸引力(特别是那些没有编程背景的系统管理员),我真的认为这对其他人来说会派上用场。