SQL Server – Backup the Reporting Services Encryption Key from a command prompt using rskeymgmt.exe

If you would like to backup your SQL Server Reporting Services encryption key from a command prompt you can use rskeymgmt.exe to accomplish this. Here is the syntax:

rskeymgmt.exe -e -f “C:\KeyBackup\RSKey.snk” -p “YourStrongPassword”

In the above command:
-e = Extracts a key from a report server instance.
-f = Full path and file name to read/write key.
-p = Password used to encrypt or decrypt key.

RSKeyMgmt has many other functions as well. Here are the other parameters you can pass to it:

-e = extract – Extracts a key from a report server instance
-a = apply – Applies a key to a report server instance
-s = reencrypt – Generates a new key and reencrypts all encrypted content
-d = delete content – Deletes all encrypted content from a report server database
-l = list – Lists the report servers announced in the report server database
-r = installation ID – Remove the key for the specified installation ID
-j = join – Join a remote instance of report server to the scale-out deployment of the local instance
-i = instance – Server instance to which operation is applied. Default is MSSQLSERVER
-f = file – Full path and file name to read/write key.
-p = password – Password used to encrypt or decrypt key.
-m = machine name – Name of the remote machine to join to the scale-out deployment
-n = instance name – Name of the remote machine instance to join to the scale-out deployment
-u = user name – User name of an administrator on the machine to join to the scale-out deployment. If not supplied, the current user is used.
-v = password – Password of an administrator on the machine to join to the scale-out deployment
-t = trace – Include trace information in error message

You can get all of the above in addition to examples by running:
RSKeyMgmt.exe /?

Stored procedure to generate a random password in SQL

For those of you who want to generate a random password here is a procedure you can use. The code is a little excessive but it has configurable parameters for length, numbers, caps/lower, etc.

Enjoy!


----------------------------------------------------------------------------
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

create procedure [dbo].[generate_password] 
  @length int = 10             -- the desired length of the password int <= 30
, @numbers varchar(1) = 'Y'    -- use numbers
, @specials varchar(1) = 'Y'   -- use special characters
, @caps varchar(1) = 'Y'       -- use caps and lower case
, @includeconfusingletters varchar(1) = 'N'  -- include letters that resemble numbers when typed out
as

--****************************************************************************************************************************************
-- Procedure: [dbo].[generate_password]
-- Description: This procedure is used to generate a random password
--****************************************************************************************************************************************

	declare @int int, @letter int, @cap int, @letter_or_number int, @number int, @special int;
	declare @cap_used varchar(1), @lower_used varchar(1), @number_used varchar(1), @special_used varchar(1);
	declare @var varchar(30)
	select @lower_used = 'N', @var = '', @int = 1; --@length = 10, 
	

    if upper(@numbers) not in ('Y', 'N') set @numbers = 'Y';
    if upper(@specials) not in ('Y', 'N') set @specials = 'Y';
    if upper(@caps) not in ('Y', 'N') set @caps = 'Y';
    
    set @numbers = upper(@numbers);
    set @specials = upper(@specials);
    set @caps = upper(@caps);

	if @numbers = 'N' set @number_used = 'Y' else set @number_used = 'N';
	if @specials = 'N' set @special_used = 'Y' else set @special_used = 'N';
    if @caps = 'N' set @cap_used = 'Y' else set @cap_used = 'N';
    if @numbers = 'N' set @includeconfusingletters = 'Y';

	if @length < 4
	begin
	   print 'Minimum password length is 4 characters... setting password length to 4 characters';
	   set @length = 4
	end
	if @length > 30
	begin
	   print 'Maximum password length is 30 characters... setting password length to 30 characters';
	   set @length = 30
	end

	while @int <= (@length) or (@cap_used = 'N' or @lower_used = 'N' or @number_used = 'N' or @special_used = 'N')
	begin
	   select @letter = ceiling(rand() * 26)
	   select @cap = round((rand() * 1),0)
	   select @letter_or_number = floor(rand() * 3)
	   select @number = floor(rand() * 10)
	   select @special = ceiling(rand() * 10)


	   if @numbers = 'Y' and @specials = 'Y'
	   begin
          select @letter_or_number = floor(rand() * 3)
	   end
	   else
	   begin
          if @numbers = 'Y' and @specials = 'N'
          begin
             select @letter_or_number = floor(rand() * 2)
          end
          else
          begin
             if @numbers = 'N' and @specials = 'Y'
             begin
                while @letter_or_number is null or @letter_or_number = 1
                begin
                   select @letter_or_number = floor(rand() * 3)
                end
             end
             else
             begin
                if @numbers = 'N' and @specials = 'N'
                begin
                   select @letter_or_number = 0
                end
             end
          end
	   end
       
       if @caps = 'N' set @cap = 0;
	   
	   if @int = @length - 3 and @lower_used = 'N'
	   begin
		  select @letter_or_number = 0, @cap = 0;
	   end
	   if @int = @length - 2 and @cap_used = 'N'
	   begin
		  select @letter_or_number = 0, @cap = 1;
	   end
	   if @int = @length - 1 and @number_used = 'N'
	   begin
		  select @letter_or_number = 1;   
	   end
	   if @int = @length and @special_used = 'N'
	   begin
		  select @letter_or_number = 2;   
	   end
	   
	   if @int = 1
	   begin
		  select @letter_or_number = 0;   
	   end

	   set @var = @var + case when @letter_or_number = 0 then
		    case when @cap = 0 then
			  case when @letter = 1 then 'a'
				when @letter = 2 then 'b'
				when @letter = 3 then 'c'
				when @letter = 4 then 'd'
				when @letter = 5 then 'e'
				when @letter = 6 then 'f'
				when @letter = 7 then 'g'
				when @letter = 8 then 'h'
				when @letter = 9 then 'i'
				when @letter = 10 then 'j'
				when @letter = 11 then 'k'
				when @letter = 12 then case when @includeconfusingletters = 'N' then 'k' else 'l' end
				when @letter = 13 then 'm'
				when @letter = 14 then 'n'
				when @letter = 15 then 'o'
				when @letter = 16 then 'p'
				when @letter = 17 then 'q'
				when @letter = 18 then 'r'
				when @letter = 19 then 's'
				when @letter = 20 then 't'
				when @letter = 21 then 'u'
				when @letter = 22 then 'v'
				when @letter = 23 then 'w'
				when @letter = 24 then 'x'
				when @letter = 25 then 'y'
				when @letter = 26 then 'z'
				end
			 else
			  upper(case when @letter = 1 then 'a'
				when @letter = 2 then 'b'
				when @letter = 3 then 'c'
				when @letter = 4 then 'd'
				when @letter = 5 then 'e'
				when @letter = 6 then 'f'
				when @letter = 7 then 'g'
				when @letter = 8 then 'h'
				when @letter = 9 then 'i'
				when @letter = 10 then 'j'
				when @letter = 11 then 'k'
				when @letter = 12 then 'l'
				when @letter = 13 then 'm'
				when @letter = 14 then 'n'
				when @letter = 15 then case when @includeconfusingletters = 'N' then 'n' else 'o' end
				when @letter = 16 then 'p'
				when @letter = 17 then 'q'
				when @letter = 18 then 'r'
				when @letter = 19 then 's'
				when @letter = 20 then 't'
				when @letter = 21 then 'u'
				when @letter = 22 then 'v'
				when @letter = 23 then 'w'
				when @letter = 24 then 'x'
				when @letter = 25 then 'y'
				when @letter = 26 then 'z'
				end)
			  end
			when @letter_or_number = 1 then rtrim(convert(varchar(2), @number))
			else 
			   case ceiling(rand() * 14) 
			        when 1 then '!'
			        when 2 then '@'
			        when 3 then '#'
			        when 4 then '$'
			        when 5 then '%'
			        when 6 then '^'
			        when 7 then '&'
			        when 8 then '*'
			        when 9 then '('
			        when 10 then ')'
			        when 11 then '+'
			        when 12 then '<'
			        when 13 then '>'
			        when 14 then '~'
			        else '!'
			    end
			end
	        
	   if @letter_or_number = 0 and @cap = 0
	   begin
		  set @lower_used = 'Y';
	   end        
	   if @letter_or_number = 0 and @cap <> 0
	   begin
		  set @cap_used = 'Y';
	   end        
	   if @letter_or_number = 1
	   begin
		  set @number_used = 'Y';
	   end
	   if @letter_or_number = 2
	   begin
		  set @special_used = 'Y';
	   end
	       
	   set @int = @int + 1;
	end

	select @var as [password];
---------------------------------------------------------------------

SQL command to change the database owner

To change the database owner using a sql command you can use the ALTER AUTHORIZATION command.

---------------------------------------------
alter authorization on database::[database_name] to new_owner;
---------------------------------------------

If you wanted to change the database owner on all the user databases on the sql server at the same time you could do something like this:

---------------------------------------------
declare @dbname varchar(128), @sql varchar(max), @owner varchar(3);
set @owner = 'sa' --- the intended databse owner
declare cursor1 cursor for 
select rtrim(name) from sys.databases 
   where databasepropertyex(name, 'Status') = 'ONLINE' 
   and name not in ('master', 'model', 'tempdb', 'msdb', 'distribution');

open cursor1;
fetch next from cursor1 into @dbname;

while @@fetch_status = 0
begin
   set @sql = 'alter authorization on database::' + quotename(@dbname) + ' to ' + @owner + ';';
   exec(@sql);

   fetch next from cursor1 into @dbname;
end
close cursor1;
deallocate cursor1;
---------------------------------------------

SQL script to set database compatability level

To set the database compatability level of a database using a t-sql commmand you will use the ALTER DATABASE command.

---------------------------------------
ALTER DATABASE [database_name] SET COMPATIBILITY_LEVEL = 90 | 100 | 110
---------------------------------------

SQL Server 2000 = compatability level 80
SQL Server 2005 = compatability level 90
SQL Server 2008 = compatability level 100
SQL Server 2012 = compatability level 110

Here is a quick and dirty script to set the compatability level of all the databases on the server:

---------------------------------------
declare @dbname varchar(128), @sql varchar(max), @level varchar(3);
set @level = '110' --- 90 | 100 | 110
declare cursor1 cursor for 
select rtrim(name) from sys.databases 
   where databasepropertyex(name, 'Status') = 'ONLINE' 
   and name not in ('master', 'model', 'tempdb', 'msdb', 'distribution');

open cursor1;
fetch next from cursor1 into @dbname;

while @@fetch_status = 0
begin
   set @sql = 'ALTER DATABASE ' + quotename(@dbname) + ' SET COMPATIBILITY_LEVEL = ' + @level + ';';
   exec(@sql);

   fetch next from cursor1 into @dbname;
end
close cursor1;
deallocate cursor1;
---------------------------------------