Показаны сообщения с ярлыком SQL. Показать все сообщения
Показаны сообщения с ярлыком SQL. Показать все сообщения

среда, 14 ноября 2012 г.

База SCCM 2012 на кластеризованном экземпляре SQL Server

При разворачивании базы SCCM 2012 на кластеризованном экземпляре, генерируется самоподписанный сертификат с отображаемым именем ConfigMgr SQL Server Identification Certificate. Сертификат генерируется на активном в момент установки узле кластера. На других узлах этого сертификата разумеется нет.
В итоге не работает failover экземпляра на узлы, отличные от изначально активного при установке.

В логах (ERRORLOG.x) имеем следующие сообщения об ошибках:
The server could not load the certificate it needs to initiate an ssl connection. It returned the following error: 0x8009030d. Check certificates to make sure they are valid
Error: 26014, Severity:16, State: 1
Unable to load user-specified certificate [Cert Hash(sha1) "certificate_hash"]. Ther server will not accept a connection. You should verify that th certificate ..........
<....>
Error: 17182, Severity: 16, State: 1
<....>
Error: 17182, Severity: 16, State: 1
<....>

Проблему можно решить следующим способом:
1) Экспортировать Self-Sign сертификат с первоначального узла и импортировать на остальные узлы кластера (с приватным ключом, конечно же).
2) Дать разрешение Full Control на приватный ключ для учетной записи из под которой запускается экземпляр кластера. Данное действие также проделывается на всех узлах этого экземпляра.

пятница, 9 сентября 2011 г.

Трансляция пользователей в SQL 2000 (миграция)

TSQL-скрипт предназначенный для трансляции Windows-пользователей и Windows-групп в SQL Server 2000.

Ссылка на скрипт: http://pastebin.com/hwc4bgZX
Важно: Не забывайте делать резервные копии :)


1. Проблема.
При миграции пользователей между лесами (доменами) основной SID пользователя меняется. Если сохраняется SID-History, то проблем не возникает. Но если далее удалить SID-history, то у пользователя может пропасть доступ к определенным ресурсам. Один из них - SQL-сервер.
Для таких ресурсов как файловые серверы есть соответствующие мастеры для смены основного старого SID в ACL на новый (ADMT, Security Translation Wizard). Но для SQL-а таких средств (известных мне) нет.
Данный скрипт решает эту проблему.

2. Как работает?
Вы запускаете скрипт. Он находит Windows-пользователей (logins) в SQL-сервере и пытается получить всех пользователей из целевого домена (получается смигрированных). Поиск происходит по логинам (sAMAccountName). Если пользователь (login) не создан в SQL, то происходит создание пользователя.
Далее происходит перебор всех баз и связывание пользователей (user) с новыми login'ами, по sid.
Старые пользователи (login) не удаляются из SQL-сервера.
Можно производить трансляцию при миграции баз данных, в том числе и системных (master) между серверами (при использовании локальных аккаунтов в качестве login).


3. Ограничения.
- Работает только с SQL Server 2000.
- Работает только если логины пользователей из старого и нового домена совпадают.
- Не транслирует системные таблицы (master, msdb, model, tempdb

4. Как запустить?
Сначала необходимо изменить переменные @SourceDomain и @TargetDomain на исходный и целевой домен соответственно.
Далее необходимо запустить скрипт. Это можно сделать с помощью инструментов SQL Query Analyzer, osql и др.



--Текст скрипта
---------------------------------------------------------
exec sp_configure 'allow_update',1
reconfigure with override
go

declare @SourceDomain nvarchar(255), @TargetDomain nvarchar(255)
set @SourceDomain = 'INTERMARK'
set @TargetDomain = 'CORP'

select name as SourceName, REPLACE(name,@SourceDomain + '\',@TargetDomain + '\') as TargetName,
    sid as SourceSID, SUSER_SID(REPLACE(name,@SourceDomain + '\',@TargetDomain + '\')) as TargetSID
into #Temp1
from master..syslogins
where (name like (@SourceDomain + '\%') or name like (@TargetDomain+'\%'))
    and SUSER_SID(REPLACE(name,@SourceDomain + '\',@TargetDomain + '\')) is not null
    and isntname = 1

declare Logins cursor local forward_only static
for
    select t1.TargetName
    from #Temp1 t1
    where not exists (select null from #Temp1 t2 where t1.TargetName = t2.SourceName)

open Logins

declare @logname nvarchar(255)

fetch next from Logins into @logname

    while @@FETCH_STATUS = 0
    begin
        exec sp_grantlogin @loginame = @logname
        fetch next from Logins into @logname
    end

close Logins
Deallocate Logins

declare Dbs cursor local forward_only static
for
    select name
    from sysdatabases
    where name not in ('master','model','tempdb','msdb')
    --where name in ('Northwind')

open Dbs

    declare @name sysname
    fetch next from Dbs into @name

    declare @sql_text nvarchar(4000)

    while @@fetch_status=0
    begin
        select 'Обработка базы ' + @name + ':'

        set @sql_text = 'select ' + QUOTENAME(@name,'''') + ' as dbname, ' +
            ' u.name as UserName, t1.SourceSID, t1.TargetSID from #Temp1 as t1 join ' +
            QUOTENAME(@name) + '..sysusers u on t1.SourceSID = u.sid'

        execute(@sql_text)

         set @sql_text = 'update users '  +
             ' set sid = t1.TargetSID' +
             ' from ' + QUOTENAME(@name)+ '..sysusers as users ' +
             ' join #Temp1 t1 on users.sid = t1.SourceSID '
       
        execute(@sql_text)

        fetch next from Dbs into @name
    end

close  Dbs
deallocate  Dbs

drop table #Temp1

exec sp_configure 'allow_update',0
reconfigure with override
go
---------------------------------------------------------

пятница, 22 октября 2010 г.