Avatar billede Lasse Novice
04. april 2008 - 02:56 Der er 9 kommentarer og
1 løsning

Problem m. EXECUTE AS

Hej

Jeg vil gerne have lavet en SP der:
- kreerer nyt brugerlogin paa min sql server.

Yderligere skal foelgende vaere opfyldt:
1) SP skal have rettighed til at indsaette nyt brugerlogin.
2) Bruger af SP skal IKKE have rettighed til at indsaette nyt brugerlogin, men have rettighed til at eksekvere SP.

Mit foerste bud var:

create PROC [dbo].[InsertUser]
(
    @UserFullName AS NVARCHAR(50),
    @UserLogin AS NVARCHAR(30),
    @UserPassword AS VARCHAR(30),
    @UserClientId AS INT)
AS

DECLARE @createQuery AS NVARCHAR(500) 
DECLARE @defDB AS VARCHAR(50)
SELECT @defDB = '[Sample]'

SET @createQuery = 'create login ' + @UserLogin + ' WITH PASSWORD = ''' + @UserPassword + ''', DEFAULT_DATABASE = ' + @defDB + ', CHECK_EXPIRATION = OFF' 

EXEC sp_executesql @createQuery 


Eksekverer jeg dette faar jeg fejlmeddelelsen:

User does not have permission to perform this action.


Hvordan goer jeg galt?
Avatar billede arne_v Ekspert
04. april 2008 - 03:18 #1
Sker der ikke helt automatisk hvis du lader SP være ejer at en bruger med priv og udfører
SP af en bruger uden priv ?
Avatar billede a1a1 Novice
04. april 2008 - 03:28 #2
er det på din egen server (eller har du sa adgang)?

jeg bruger normalt "bare" mssql management studio til det... (men har for det meste også sa login)
Avatar billede Lasse Novice
04. april 2008 - 17:35 #3
a1>> meningen er at jeg skal kunne kalde det fra mit c# program via den bruger som er logget ind paa sql serveren. (en slags management system).

arne_v>> Hvordan skifter jeg ejeren paa en SP og hvilken type ejer skal dette vaere?
Avatar billede Lasse Novice
04. april 2008 - 17:45 #4
Maaske skulle det naevnes at jeg bruger sql 2005
Avatar billede Lasse Novice
04. april 2008 - 18:29 #5
arne_v>> Jeg har kigget lidt paa det:

1) Opret nyt login = "test" med server role = "public", "sysadmin".
2) Opret ny user = "test" med database role = "db_owner" til login = "test".
3) Opret schema = "test" med ejer = "test".
4) Opret SP
create PROC test.InsertUser AS
create login delme WITH PASSWORD = 'test', DEFAULT_DATABASE = [dbname], CHECK_EXPIRATION = OFF
5) Login som "test"
6) eksekver InsertUser => eksekvering udfoert korrekt!
7) login som "brugerX"
8) eksekver InsertUser => User does not have permission to perform this action!
9) Slet SP og opret ny SP
create PROC test.InsertUser AS
select 1
10) login som "test"
11) eksekver InsertUser => eksekvering udfoert korrekt!
12) login som "brugerX"
13) eksekver InsertUser => eksekvering udfoert korrekt!

arne_v>> Det er lidt modsigende til det du skriver, er det ikke?
Avatar billede Lasse Novice
04. april 2008 - 18:58 #6
Her har vi problemet:

http://www.sqlservercentral.com/articles/Security/dynamicsqlversusstaticsqlp1/617/

Findes der en maade hvorpaa der ikke skal bruges dynamisk sql til at generere et login?
Avatar billede a1a1 Novice
05. april 2008 - 06:12 #7
prøv at kigge i master databasens storedprocedures, prøv f.eks. at se nedenstående

USE [master]
GO
/****** Object:  StoredProcedure [sys].[sp_addlogin]    Script Date: 04/05/2008 06:08:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [sys].[sp_addlogin]
    @loginame        sysname
  ,@passwd        sysname = Null
  ,@defdb          sysname = 'master'      -- UNDONE: DEFAULT CONFIGURABLE???
  ,@deflanguage    sysname = Null
  ,@sid            varbinary(16) = Null
  ,@encryptopt        varchar(20) = Null
AS
    -- SETUP RUNTIME OPTIONS / DECLARE VARIABLES --
    set nocount on
    declare @exec_stmt nvarchar(4000)
    declare @hextext varchar(256)
    declare @ret int

    -- DISALLOW USER TRANSACTION --
    set implicit_transactions off
    IF (@@trancount > 0)
    begin
        raiserror(15002,-1,-1,'sys.sp_addlogin')
        return (1)
    end

    -- VALIDATE LOGIN NAME:
    execute @ret = sys.sp_validname @loginame
    if (@ret <> 0)
        return (1)

    set @exec_stmt = 'create login ' + quotename(@loginame)

    if @passwd is null
        select @passwd = ''

    if (@encryptopt is null)
        set @exec_stmt = @exec_stmt + ' with password = ' + quotename(@passwd, '''')
    else
    begin
        declare @passwdbin varbinary(256)
        set @passwdbin = convert(varbinary(256), @passwd)
        execute sys.sp_hexadecimal @passwdbin, @hextext OUT
        set @exec_stmt = @exec_stmt + ' with password = ' + @hextext

        if (@encryptopt = 'skip_encryption_old')
            set @exec_stmt = @exec_stmt + ' hashed '
        else if (@encryptopt = 'skip_encryption')
            set @exec_stmt = @exec_stmt + ' hashed '
        else
        begin
            raiserror(15600,-1,-1,'sys.sp_addlogin')
            return 1
        end
    end
   
    if (@defdb is not null)
        set @exec_stmt = @exec_stmt + ', default_database = ' + quotename(@defdb)

    if (@deflanguage is not null)
        set @exec_stmt = @exec_stmt + ', default_language = ' + quotename(@deflanguage)

    if (@sid is not null)
    begin
        execute sys.sp_hexadecimal @sid, @hextext OUT
        set @exec_stmt = @exec_stmt + ', sid = ' + @hextext
    end

    exec (@exec_stmt)

    if @@error <> 0
        return (1)

    -- RETURN SUCCESS --
    return  (0)    -- sp_addlogin
Avatar billede Lasse Novice
05. april 2008 - 18:27 #8
a1>> Denne SP lider desvaerre under samme problem.
Avatar billede Lasse Novice
11. august 2010 - 16:57 #9
a1 >> svar => point
Avatar billede Lasse Novice
14. september 2010 - 20:27 #10
lukker spg.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester