AD: как создать служебную учётную запись для bj — скрипт и инструкция

«Пользователи и вход → Подключить домен»: блок с инструкцией и готовым
скриптом PowerShell (svc-bj, пароль не истекает, группы bj-admins /
bj-operators / bj-risk / bj-viewers для ролей) и запасной командой dsadd;
домен и DN подставляются из найденного bj домена. Кнопка «Скопировать».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-22 12:46:28 +03:00
parent c6f83e212e
commit 40a7f10d88
@@ -82,6 +82,38 @@
{{if $D}}{{$bu = $D.BindUser}}{{$pw = ""}}{{if $D.HasPassword}}{{$pw = "введён"}}{{end}}{{$fs = $D.Form.Server}}{{$fd = $D.Form.Domain}}{{$adv = $D.Form.Adv}}{{end}}
<p class="muted" style="font-size:13px;margin:8px 0 0">Введите учётную запись домена и пароль — домен и его контроллеры bj найдёт сам. Прав администратора домена не нужно; лучше отдельная служебная запись (например svc-bj): bj хранит её пароль, чтобы искать сотрудников.</p>
<div id="ad-found" class="ad-st" hidden aria-live="polite"></div>
<details id="ad-svc" style="margin:10px 0 0"><summary style="cursor:pointer;font-size:13px;color:var(--accent)">Как создать служебную учётную запись для bj</summary>
<div style="font-size:13px;line-height:1.5;margin-top:8px">
<p style="margin:0 0 6px">bj читает AD обычной доменной учётной записью: проверяет пароль пользователя и его группы. Прав администратора домена ей не нужно — читать каталог могут все пользователи домена. Создаёт запись администратор домена:</p>
<ol style="margin:0 0 8px;padding-left:20px">
<li>На контроллере домена (или компьютере с RSAT) откройте PowerShell <b>от имени администратора домена</b>.</li>
<li>Скопируйте и выполните скрипт ниже — он спросит пароль для <code>svc-bj</code>.</li>
<li>Добавьте сотрудников в группы <code>bj-admins</code>, <code>bj-operators</code>, <code>bj-risk</code>, <code>bj-viewers</code> — по ним bj назначит роли (группы можно переназначить после подключения).</li>
<li>Здесь введите <code>svc-bj@<span class="ad-svc-dom">{{with $A.ADDomain}}{{.}}{{else}}ваш-домен{{end}}</span></code> и пароль — «Подключить».</li>
</ol>
<pre class="copyable" id="ad-svc-ps" style="white-space:pre;overflow:auto;font-size:12px"># Bridge&amp;Join: служебная учётная запись для чтения AD и группы ролей
Import-Module ActiveDirectory
$dom = Get-ADDomain # домен <span class="ad-svc-dom">{{with $A.ADDomain}}{{.}}{{else}}ваш-домен{{end}}</span>
$name = "svc-bj"
$ou = $dom.UsersContainer # или своё OU, например "OU=Service Accounts,$($dom.DistinguishedName)"
$pwd = Read-Host "Пароль для $name (длинный, случайный)" -AsSecureString
New-ADUser -Name $name -SamAccountName $name -UserPrincipalName "$name@$($dom.DNSRoot)" `
-Path $ou -AccountPassword $pwd -Enabled $true `
-PasswordNeverExpires $true -CannotChangePassword $true `
-Description "Bridge&amp;Join: чтение AD для входа пользователей (без прав администратора)"
# Группы, по которым bj назначает роли
@{ "bj-admins" = "администраторы bj"; "bj-operators" = "операторы депозитария";
"bj-risk" = "риск-менеджеры (НПР)"; "bj-viewers" = "наблюдатели" }.GetEnumerator() | ForEach-Object {
if (-not (Get-ADGroup -Filter "Name -eq '$($_.Key)'")) {
New-ADGroup -Name $_.Key -GroupScope Global -GroupCategory Security -Path $ou -Description "Bridge&amp;Join: $($_.Value)"
}
}
Write-Host "Готово. В bj: учётная запись $name@$($dom.DNSRoot)"</pre>
<p class="muted" style="margin:6px 0 4px">Без модуля ActiveDirectory (cmd от администратора домена, <code>*</code> — запросит пароль):</p>
<pre class="copyable" id="ad-svc-cmd" style="white-space:pre;overflow:auto;font-size:12px">dsadd user "CN=svc-bj,CN=Users,<span class="ad-svc-dn">{{with $A.ADBaseDN}}{{.}}{{else}}DC=corp,DC=example,DC=ru{{end}}</span>" -samid svc-bj -upn svc-bj@<span class="ad-svc-dom">{{with $A.ADDomain}}{{.}}{{else}}ваш-домен{{end}}</span> -pwd * -pwdneverexpires yes -canchpwd no -desc "Bridge&amp;Join: чтение AD"</pre>
<p class="muted" style="margin:6px 0 0">Рекомендуем: запретить этой записи интерактивный вход и вход по RDP (групповая политика «Запретить локальный вход», «Запретить вход через службу удалённых рабочих столов») — она нужна только для чтения каталога. Пароль bj хранит у себя; при смене пароля в AD обновите его здесь.</p>
</div>
</details>
<form method="post" action="/admin/setup/users/ad-connect" class="acc-form" id="ad-form">
<input type="hidden" name="return_to" value="{{$.Ret}}"><input type="hidden" name="section" value="acc-ad">
<label>Учётная запись домена<input type="text" name="ad_bind_user" data-need="учётная запись домена" value="{{$bu}}" placeholder="svc-bj или svc-bj@corp.example.ru" autocomplete="off"></label>
@@ -104,6 +136,8 @@
fetch('/admin/setup/users/ad-discover',{cache:'no-store',headers:{'Accept':'application/json'}}).then(function(r){return r.json()}).then(function(d){
var x=d.found;
out.hidden=false;
if(x&&x.domain){ document.querySelectorAll('.ad-svc-dom').forEach(function(e){ e.textContent=x.domain; });
document.querySelectorAll('.ad-svc-dn').forEach(function(e){ e.textContent=x.domain.split('.').map(function(p){return 'DC='+p}).join(','); }); }
if(d.ok){ out.className='ad-st ad-st-ok'; out.innerHTML='<span class="ad-st-ic"></span><div><b>Найден домен '+esc(x.domain)+'</b><small>контроллеры: '+x.dcs.map(esc).join(', ')+' · '+esc(x.from)+'</small></div>';
f.ad_domain.placeholder=x.domain+' — найден сам'; f.ad_server.placeholder=x.dcs[0]+' — найден сам'; return; }
out.className='ad-st ad-st-warn'; out.innerHTML='<span class="ad-st-ic"></span><div><b>'+(x&&x.domain?'Домен '+esc(x.domain)+' найден, но его контроллеры — нет':'Домен сам не нашёлся')+'</b><small>'+(x&&x.domain?'укажите контроллер в расширенных настройках ниже':'укажите домен в расширенных настройках ниже или впишите учётную запись с доменом: svc-bj@corp.example.ru')+'</small></div>';