2

一般来说,我是 powershell/scripting/life 的新手,但最后我遇到了一个值得寻求帮助的问题:我在环境中有各种 Windows 本地化 - 当前环境中的英语、芬兰语和俄语,但有可能拥有其他斯堪的纳维亚/欧洲本地化。我需要将经过身份验证的用户添加到管理员组。我可以用英语编写脚本:

NET LOCALGROUP Administrators "Authenticated Users" /add,

但我不会知道所有本地化名称。例如,在俄语中,它将是“Administratori”和“Proshedshie Proverku”。在西里尔语中,无论如何我并不那么强大。当然,我知道 SID——S-1-5-32-544 用于管理员,S-1-5-11 用于经过身份验证的用户。然而,运行

NET LOCALGROUP S-1-5-32-544 S-1-5-11 /add returns error that group doesn't exist. Ok, so I found a script to check it -

$objUser = New-Object System.Security.Principal.NTAccount("kenmyer")

$strSID = $objUser.Translate([System.Security.Principal.SecurityIdentifier])

$strSID.Value

这将返回预期值,到目前为止一切顺利。然后我尝试仔细检查它-通过运行从 SID 获取名称的行-

$Admin = (Get-WMIObject -Class Win32_Group -Filter "LocalAccount=True and SID='S-1-5-32-544'").Name

$Auth = (Get-WMIObject -Class Win32_Group -Filter "LocalAccount=True and SID='S-1-5-11'").Name

And $Admin= Administratori(应该如此),而$Auth= 没有。没有名字。这就是我停下来的地方。我也在英语环境中尝试过这个 - 仍然得到“没有这样的组”消息。运行我写的第一个命令,两个名字都是英文 - 工作得很好。

有任何想法吗?

Upd:也许我无法正确解释我要做什么,所以让脚本来说话:

#Task: to add "Authenticated users" to "Administrators" group in any languange OS.
$objSID = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-32-544")
$objgroup = $objSID.Translate( [System.Security.Principal.NTAccount])
$objgroupnameAdm = ($objgroup.Value).Split("\")[1]

$objSID = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-11")
$objgroup = $objSID.Translate( [System.Security.Principal.NTAccount])
$objgroupnameAuth = ($objgroup.Value).Split("\")[1]

#Administratörer
#Autentiserade användare

net localgroup $objgroupnameAdm $objgroupnameAuth /add

我现在在瑞典的 Win7 上试试这个。所以结果是:

net.exe : Syntaxen för kommandot är:
At line:13 char:4
+ net <<<<  localgroup $objgroupnameAdm $objgroupnameAuth /add
    + CategoryInfo          : NotSpecified: (Syntaxen för kommandot är::String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

我也尝试过$objgroupnameAuth加上引号,因为它包含两个单词,但结果相同。将变量定义为字符串 - 没有变化,并用$objGroupNameAdm实际值替换 - 没有变化。

如果我不能在英文 Windows 中做到这一点,我会认为它在功能上是不可能的。

4

3 回答 3

1

我使用此方法将 SID 转换为本地化名称:

.SYNOPSIS 将“NT AUTHORITY\Interactive 安全主体添加到本地计算机管理员组”

.DESCRIPTION 此脚本使用 SID 转换来接收 Interactive 主体和 Administrators 组的本地化名称,然后使用本地化名称将主体添加到组中。

# Translate the S-1-5-32-544 (.\Administrators) SID to a group name, the name varies depending on the language version of Windows.
$sid2 = 'S-1-5-32-544'
$objSID2 = New-Object System.Security.Principal.SecurityIdentifier($sid2)
$localadminsgroup = (( $objSID2.Translate([System.Security.Principal.NTAccount]) ).Value).Split("\")[1]

# Translate the S-1-5-4 (NT AUTHORITY\Interactive) SID to an account name, the name varies depending on the language version of Windows.
$sid1 = 'S-1-5-4'
$objSID1 = New-Object System.Security.Principal.SecurityIdentifier($sid1)
$interactive = (( $objSID1.Translate([System.Security.Principal.NTAccount]) ).Value).Split("\")[1]

# Add the security principal name to the local administrators group. (used old style of adding group members due to compatibility reasons)

try {
    Write-Host "Adding security principal: $interactive to the $localadminsgroup group..."

    $group = [ADSI]"WinNT://$env:computername/$localadminsgroup,group"
    $ismember = "False"

    @($group.Invoke("Members")) | ForEach-Object {
        If ($interactive -match $_.GetType.Invoke().InvokeMember("Name", 'GetProperty', $null, $_, $null)) {
            $ismember = "True"
        }
    }

    If ($ismember -eq "True") {
        write-host "user $interactive is already a member of $localadminsgroup"
    }
    Else {
        $result = $group.Add("WinNT://NT AUTHORITY/$interactive,user")
        write-host "user $interactive is added to $localadminsgroup"
    }
}
Catch {
    write-host $_.Exception.Message
}

它并不完全根据您的需要量身定制,但我相信您可以让它发挥作用。

问候,

科恩。

于 2018-02-14T13:27:36.260 回答
0

问题很简单,只要问得正确,就可以在这里找到答案:Microsoft Supprt: NET /ADD command。如果NET限制是 20 个字符,而“Autentiserade användare”是 24 个字符,则它不应该工作。解决方法可在同一链接中找到。

于 2014-12-08T07:10:16.563 回答
0

SIDS-1-5-11用于Authenticated Users众所周知的 SID)。那是一个无法修改的 BUILTIN 组。像这样的其他组是Everyone, 或Anonymous, 等等。

这种类型的组在“物理”意义上或单词中不存在,即在本地 SAM 和 Active Directory 中都没有创建对象。

它们完全由 Windows 生成和管理。

根据您连接和/或登录的方式,您会在会话中收到 SID。

因此发出WMI Win32_Group请求或使用Get-ADGroup不会返回任何内容。

您可以调用Get-ADAccountAuthorizationGroup来查看特定身份是否是此类组的成员。

您可以使用 SID 来检索创建一个System.Security.Principal.NTAccount指向的对象Authenticated Users

$auth = New-Object System.Security.Principal.SecurityIdentifier("S-1-5-11") 
$name = $auth.Translate([System.Security.Principal.NTAccount])

更新:我无法将 $auth 的本地化名称添加到该组。好像只有英文版有效。

于 2014-12-05T07:05:19.737 回答