|
|
|||||||||||||||||||||||||||||
|
Снимок УЗ в SQL ServerИсточник: е-sql
Появилась необходимость делать "снимок" всех логинов на сервере БД со всеми правами внутри сервера и правами на все базы, с возможностью быстро скриптом вернуть это состояние без накатывания БэкАпов. Для этого случая я навоял небольшой скрипт, думаю он будет многим полезен, так как ещё одно его применение-это перенос УЗ между серверами БД. За основу взял скрипт от microsoft (http://support.microsoft.com/kb/918992/ru), добавил помимо переноса логинов ещё и перенос серверных ролей+создание юзеров со всеми правами на базы.
001.USE master002.GO003.IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL004. DROP PROCEDURE sp_hexadecimal005.GO006.CREATE PROCEDURE sp_hexadecimal007. @binvalue varbinary(256),008. @hexvalue varchar (514) OUTPUT009.AS010.DECLARE @charvalue varchar (514)011.DECLARE @i int012.DECLARE @length int013.DECLARE @hexstring char(16)014.SELECT @charvalue = '0x'015.SELECT @i = 1016.SELECT @length = DATALENGTH (@binvalue)017.SELECT @hexstring = '0123456789ABCDEF'018.WHILE (@i <= @length)019.BEGIN020. DECLARE @tempint int021. DECLARE @firstint int022. DECLARE @secondint int023. SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))024. SELECT @firstint = FLOOR(@tempint/16)025. SELECT @secondint = @tempint - (@firstint*16)026. SELECT @charvalue = @charvalue +027. SUBSTRING(@hexstring, @firstint+1, 1) +028. SUBSTRING(@hexstring, @secondint+1, 1)029. SELECT @i = @i + 1030.END031. 032.SELECT @hexvalue = @charvalue033.GO034. 035.IF OBJECT_ID ('sp_help_revlogin_with_roles') IS NOT NULL036. DROP PROCEDURE sp_help_revlogin_with_roles037.GO038.CREATE PROCEDURE sp_help_revlogin_with_roles @login_name sysname = NULL AS039.DECLARE @name sysname040.DECLARE @type varchar (1)041.DECLARE @hasaccess int042.DECLARE @denylogin int043.DECLARE @is_disabled int044.DECLARE @PWD_varbinary varbinary (256)045.DECLARE @PWD_string varchar (514)046.DECLARE @SID_varbinary varbinary (85)047.DECLARE @SID_string varchar (514)048.DECLARE @tmpstr varchar (1024)049.DECLARE @is_policy_checked varchar (3)050.DECLARE @is_expiration_checked varchar (3)051. 052.DECLARE @defaultdb sysname053. 054.DECLARE @srvrolemember sysname055.DECLARE @str varchar(max)056. 057.IF (@login_name IS NULL)058. DECLARE login_curs CURSOR FOR059. 060. SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM061.sys.server_principals p LEFT JOIN sys.syslogins l062. ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'063.ELSE064. DECLARE login_curs CURSOR FOR065. 066. SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM067.sys.server_principals p LEFT JOIN sys.syslogins l068. ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_name069.OPEN login_curs070. 071.FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin072.IF (@@fetch_status = -1)073.BEGIN074. PRINT 'Имена не найдены.'075. CLOSE login_curs076. DEALLOCATE login_curs077. RETURN -1078.END079.SET @tmpstr = '/* sp_help_revlogin script '080.PRINT @tmpstr081.SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'082.PRINT @tmpstr083.PRINT ''084.WHILE (@@fetch_status <> -1)085.BEGIN086. IF (@@fetch_status <> -2)087. BEGIN088. PRINT ''089. SET @tmpstr = '-- Login: ' + @name090. PRINT @tmpstr091. 092. SET @tmpstr = 'IF EXISTS (SELECT * FROM sys.server_principals WHERE name= ' + QUOTENAME( @name , '''') + ' ) DROP LOGIN ' + QUOTENAME( @name ) +';'093. PRINT @tmpstr094. 095. IF (@type IN ( 'G', 'U'))096. BEGIN -- NT authenticated account/group097. 098. SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'099. END100. ELSE BEGIN -- SQL Server authentication101. -- obtain password and sid102. SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )103. EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT104. EXEC sp_hexadecimal @SID_varbinary, @SID_string OUT105. 106. -- obtain password policy state107. SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name108. SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name109. 110. SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'111. 112. IF ( @is_policy_checked IS NOT NULL )113. BEGIN114. SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked115. END116. IF ( @is_expiration_checked IS NOT NULL )117. BEGIN118. SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked119. END120. END121. IF (@denylogin = 1)122. BEGIN -- login is denied access123. SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )124. END125. ELSE IF (@hasaccess = 0)126. BEGIN -- login exists but does not have access127. SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )128. END129. IF (@is_disabled = 1)130. BEGIN -- login is disabled131. SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE;'132. END133. PRINT @tmpstr134. END135. 136. --sp_addsrvrolemember137. DECLARE srvrolemember_curs CURSOR FOR138. SELECT r.name FROM sys.server_role_members rm139. INNER JOIN140. sys.server_principals r ON rm.role_principal_id=r.principal_id141. INNER JOIN142. sys.server_principals p ON rm.member_principal_id=p.principal_id143. WHERE p.name=@name144. OPEN srvrolemember_curs145. FETCH NEXT FROM srvrolemember_curs INTO @srvrolemember146. WHILE (@@fetch_status <> -1)147. BEGIN148. IF (@@fetch_status <> -2)149. BEGIN150. SET @tmpstr = 'EXEC sp_addsrvrolemember ' + QUOTENAME( @name ) + ', '+ QUOTENAME( @srvrolemember ) + ';'151. PRINT @tmpstr152. END153. FETCH NEXT FROM srvrolemember_curs INTO @srvrolemember154. END155. CLOSE srvrolemember_curs156. DEALLOCATE srvrolemember_curs157. 158. --CREATE USERS159. set @str='USE ?160. IF EXISTS (SELECT * FROM sys.database_principals WHERE sid='+161. CONVERT (VARCHAR(514), @SID_varbinary, 1)+')162. BEGIN163. DECLARE @name sysname, @schema sysname164. SELECT @name=name, @schema=default_schema_name FROM sys.database_principals WHERE sid='+165. CONVERT (VARCHAR(514), @SID_varbinary, 1)+166. 'print "USE ?;167. IF EXISTS (SELECT * FROM sys.database_principals WHERE name=''"+@name+"'')168. DROP USER "+QUOTENAME(@name)+";169. CREATE USER "+QUOTENAME(@name)+" FOR LOGIN '+ QUOTENAME( @name ) +' WITH DEFAULT_SCHEMA = "+QUOTENAME(@schema)+";"170. 171. DECLARE @dbrolemember sysname172. DECLARE dbrolemember_curs CURSOR FOR173. SELECT r.name FROM sys.database_role_members rm174. INNER JOIN175. sys.database_principals r ON rm.role_principal_id=r.principal_id176. INNER JOIN177. sys.database_principals p ON rm.member_principal_id=p.principal_id178. WHERE p.name=@name179. OPEN dbrolemember_curs180. FETCH NEXT FROM dbrolemember_curs INTO @dbrolemember181. WHILE (@@fetch_status <> -1)182. BEGIN183. IF (@@fetch_status <> -2)184. BEGIN185. PRINT "EXEC sp_addrolemember "+QUOTENAME(@dbrolemember)+", "+QUOTENAME(@name)+";"186. END187. FETCH NEXT FROM dbrolemember_curs INTO @dbrolemember188. END189. CLOSE dbrolemember_curs190. DEALLOCATE dbrolemember_curs191. END192. '193. EXECUTE sp_MSforeachdb @str194. 195. FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin196. END197.CLOSE login_curs198.DEALLOCATE login_curs199.RETURN 0200.GOПримечание. Сценарий создает в базе данных master две хранимых процедуры - sp_hexadecimal и sp_help_revlogin_with_roles. Далее вызываем процедуру и получаем скрипт-снимок состояния УЗ на сервере БД: 1.EXEC master..sp_help_revlogin_with_rolesСценарий, который создается хранимой процедурой sp_help_revlogin_with_roles, является сценарием входа. Этот сценарий создает имена входа с исходным идентификатором (ИД) безопасности и паролем. Ссылки по теме
|
|
|||||||