2014-12-04 2 views
2

Я новичок в powershell/scripting/life вообще, но, наконец, у меня возникла проблема, которая заслуживает помощи: У меня разные локализации Windows в среде - Английском, финском и русском языках в нынешних условиях, но с возможностью иметь другие локализации в Скандинавии/Европе. Мне нужно добавить пользователей, прошедших проверку подлинности, в группу «Администраторы». Я могу написать его на английском языке:Добавление членов в локальные группы по SID на нескольких языках

NET LOCALGROUP Administrators "Authenticated Users" /add, 

но я не буду знать все локализованные имена. Например, на русском языке это были бы «Администраторы» и «Прошедшие Проверку». В кириллице я не настолько силен. Конечно, я знаю SIDs-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 = ничего. Нет имени. И тут я остановился. Я попробовал это и в английской среде, но все еще получил сообщение «нет такой группы». Запуск первой команды, которую я написал, с обоими именами на английском языке - отлично работает.

Любые идеи?

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, я бы предположил, что это просто функционально невозможно.

+0

Вы можете также попробовать этот вопрос на SE Security (http://security.stackexchange.com/) – neontapir

+0

Этот ответ должен получить, что вам нужно: http://stackoverflow.com/questions/21288220/get-all-local-members-and-groups-shows-together –

+0

@EricLongstreet, эта ссылка сделала мне еще один шаг - я могу получить оба имени на любом языке. Однако, когда я пытаюсь добавить группу «Проверенные пользователи в группу администраторов», я все равно получаю сообщение об ошибке «Не может быть сделано, потому что пользователь не существует». Сценарий по-прежнему работает на английском языке Windows - либо с «net localgroup», либо «[ADSI]» из [link] (http://blogs.technet.com/b/heyscriptingguy/archive/2010/11/25/use-powershell- to-add-local-users-to-local-groups.aspx). –

ответ

0

Вопрос прост, после правильного запроса, и ответ можно найти здесь: Microsoft Supprt: NET /ADD command. Если NET предел составляет 20 символов, а «Autentiserade användare» - 24 символа, он не должен работать. Обходной путь можно найти по той же ссылке.

0

SID S-1-5-11 используется для Authenticated Users (Well known SIDs). Это группа 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]) 

UPDATE: Я не мог добавить локализованное имя $ Auth к этой группе. Похоже, работает только английская версия.

+0

Моя конечная цель - добавить локальную группу «Аутентифицированные пользователи» в локальную группу «Администраторы». Для практических целей я мог бы добавить «Пользователи домена», и это даст результат - любой администратор на этом компьютере - но это будет нарушение безопасности, поскольку это позволит неограниченный удаленный доступ и т. Д. –

+0

Вы можете использовать приложение «Управление компьютером» (от Консоль), чтобы добавить его вручную, вместо этого я обновил ответ, чтобы получить объект, указывающий на эту группу. –

+0

И если это будет только вариант, то мы, конечно, пойдем с этим, однако, поскольку это можно сделать в PS на английском языке, должно быть возможно сделать это и на других языках, подумал я. –

0

Я использую этот метод, чтобы перевести из SID на локализованное имя:

.SYNOPSIS добавляет «принципал безопасности NT AUTHORITY \ Интерактивной к локальной группе администраторов компьютера»

.DESCRIPTION Этот скрипт использует SID для получения локализованного имени для интерактивного принципала и группы «Администраторы», а затем добавляет принципала в группу с использованием локализованных имен.

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

Это не полностью адаптировано к тому, что вам нужно, но я уверен, что вы можете заставить его работать.

С уважением,

Koen.