gpt4 book ai didi

powershell - 多语言SID添加本地群组成员

转载 作者:行者123 更新时间:2023-12-03 00:01:25 28 4
gpt4 key购买 nike

一般来说,我是 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

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

有什么想法吗?

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

#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 中执行此操作,我会认为它在功能上是不可能的。

最佳答案

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

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

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

# 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
}

它并不完全适合您的需求,但我相信您可以让它发挥作用。

问候,

科恩。

关于powershell - 多语言SID添加本地群组成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27296203/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com