AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 230993
Accepted
SpaceGhost440
SpaceGhost440
Asked: 2019-03-01 11:29:17 +0800 CST2019-03-01 11:29:17 +0800 CST 2019-03-01 11:29:17 +0800 CST

CRIAR ASSEMBLY System.DirectoryServices.AccountManagement.dll sem habilitar TRUSTWORTHY

  • 772

Primeiro, isso é para o SQL Server 2016. Se eu estivesse em 2017+, estaria usando o sp_add_trusted_assembly. Só queria esclarecer isso antes de fazer a pergunta.

Como você registra o assembly System.DirectoryServices.AccountManagement.dll sem usar TRUSTWORTHY ON? Não consigo fazê-lo funcionar usando uma chave assimétrica gerada a partir de System.DirectoryServices.dll . A dll AccountManagement é assinada de forma diferente de System.DirectoryServices.dll .

Eu até tentei criar uma chave assimétrica separada de System.DirectoryServices.AccountManagement.dll , mas isso resulta em:

Msg 15468, Level 16, State 7, Line XXXXX
Ocorreu um erro durante a geração da chave assimétrica.

Aqui está um script de teste que escrevi para tentar criar este assembly.

USE master

IF DB_ID('CLR_Test') IS NULL BEGIN
    CREATE DATABASE CLR_Test
END
GO

USE [CLR_Test]
GO

EXEC sp_configure @configname=clr_enabled, @configvalue=1
GO
RECONFIGURE
GO

/*************************************************************************************/
-- DROP OBJECTS IF FOUND FIRST
/*************************************************************************************/

-- DROP System.DirectoryServices.AccountManagement
IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices.AccountManagement') BEGIN 
    RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices.AccountManagement]', 0, 1) WITH NOWAIT
    DROP ASSEMBLY [System.DirectoryServices.AccountManagement]
END

-- DROP System.DirectoryServices.Protocols
IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices.Protocols') BEGIN 
    RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices.Protocols]', 0, 1) WITH NOWAIT
    DROP ASSEMBLY [System.DirectoryServices.Protocols]
END

-- DROP System.DirectoryServices
IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices') BEGIN 
    RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices]', 0, 1) WITH NOWAIT
    DROP ASSEMBLY [System.DirectoryServices]
END
GO
IF EXISTS(SELECT 1 FROM sys.database_principals dp WHERE dp.name = 'MSFT_CLR_Login') 
BEGIN
    RAISERROR( 'DROP USER [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
    DROP USER [MSFT_CLR_Login] 
END
GO
USE [master]
GO
IF (EXISTS(SELECT 1 FROM master.sys.syslogins WHERE name = 'MSFT_CLR_Login'))
BEGIN
    RAISERROR( 'DROP LOGIN [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
    DROP LOGIN [MSFT_CLR_Login] 
END
GO
IF (EXISTS(SELECT 1 FROM master.sys.asymmetric_keys WHERE name = 'MSFT_CLR_Key'))
BEGIN
    --DROP ASYMMETRIC KEY [ClrKey]
    RAISERROR( 'DROP ASYMMETRIC KEY [MSFT_CLR_Key]', 0, 1) WITH NOWAIT
    DROP ASYMMETRIC KEY [MSFT_CLR_Key] 
END
GO

/*************************************************************************************/
-- CREATE THE OBJECTS
/*************************************************************************************/
USE [master]
GO
IF (NOT EXISTS(SELECT 1 FROM master.sys.asymmetric_keys WHERE name = 'MSFT_CLR_Key'))
BEGIN
    --DROP ASYMMETRIC KEY [ClrKey]
    RAISERROR( 'CREATE ASYMMETRIC KEY [MSFT_CLR_Key]', 0, 1) WITH NOWAIT
    CREATE ASYMMETRIC KEY [MSFT_CLR_Key] 
    FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.dll'
END
GO
IF (NOT EXISTS(SELECT 1 FROM master.sys.syslogins WHERE name = 'MSFT_CLR_Login'))
BEGIN
    RAISERROR( 'CREATE LOGIN [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
    CREATE LOGIN [MSFT_CLR_Login] FROM ASYMMETRIC KEY [MSFT_CLR_Key]
END
GO

RAISERROR( 'GRANT UNSAFE ASSEMBLY', 0, 1) WITH NOWAIT
GRANT UNSAFE ASSEMBLY TO [MSFT_CLR_Login]
GO
RAISERROR( 'GRANT EXTERNAL ASSEMBLY', 0, 1) WITH NOWAIT
GRANT EXTERNAL ACCESS ASSEMBLY TO [MSFT_CLR_Login]
GO

USE CLR_Test
GO

IF NOT EXISTS(SELECT 1 FROM sys.database_principals dp WHERE dp.name = 'MSFT_CLR_Login') 
BEGIN
    RAISERROR( 'CREATE USER [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
    CREATE USER [MSFT_CLR_Login] FOR LOGIN [MSFT_CLR_Login]
END
GO

/*************************************************************************************/
-- CREATE THE CLR OBJECTS
/*************************************************************************************/

USE CLR_Test
GO

/****************************************************************************/
-- [System.DirectoryServices]
/****************************************************************************/
CREATE ASSEMBLY [System.DirectoryServices] 
FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.dll'
WITH PERMISSION_SET = UNSAFE

/****************************************************************************/
-- [System.DirectoryServices.Protocols]
/****************************************************************************/
CREATE ASSEMBLY [System.DirectoryServices.Protocols] 
FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.Protocols.dll'
WITH PERMISSION_SET = UNSAFE

/****************************************************************************/
-- [System.DirectoryServices.AccountManagement]
/****************************************************************************/
CREATE ASSEMBLY [System.DirectoryServices.AccountManagement] 
FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.AccountManagement.dll'
WITH PERMISSION_SET = UNSAFE



/*
-- NOR CAN YOU CREATE AN ASSYMETRIC KEY OFF System.DirectoryServices.AccountManagement.dll

CREATE ASYMMETRIC KEY [MSFT_SDA_CLR_Key] 
FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.AccountManagement.dll'

-- results in:
--      Msg 15468, Level 16, State 7, Line 130
--      An error occurred during the generation of the asymmetric key.
*/
sql-server sql-server-2016
  • 2 2 respostas
  • 1418 Views

2 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2019-03-01T11:40:53+08:002019-03-01T11:40:53+08:00

    Não, uma chave assimétrica não funcionará, provavelmente porque os assemblies de nomenclatura forte foram alterados no .NET 4.5 ou em algum lugar por aí, para agora ser uma nomenclatura forte aprimorada, que não é suportada pelo host CLR do SQL Server (não sem renunciar a ele, o que não funcionará aqui).

    A chave é usar certificados. Crie um certificado na masterDLL, crie o logon desse certificado e, finalmente, conceda a UNSAFE ASSEMBLYpermissão para esse logon.

    Deve ser simples assim (assumindo, é claro, que a DLL é MSIL puro e não misto, porque apenas assemblies MSIL puros podem ser carregados no SQL Server).

    Também:

    1. Você não deve adicionar/soltar mais do que o assembly principal, supondo que eles sejam referenciados pelo main. Ao adicionar assemblies via DLL (em oposição a bytes hexadecimais/ VARBINARYliterais), o SQL Server pegará todos os assemblies referenciados que estiverem na mesma pasta. Ele definirá todos esses assemblies adicionados automaticamente para "visible = 0". Os assemblies definidos como "visible = 0" referenciados por um assembly principal são automaticamente descartados se o assembly principal for descartado.
    2. Você não precisa conceder permissões UNSAFE ASSEMBLYe EXTERNAL ACCESS ASSEMBLYpara o logon baseado em assinatura. A UNSAFE ASSEMBLYpermissão assume a EXTERNAL ACCESS ASSEMBLYpermissão de forma que você possa definir assemblies para qualquer um deles PERMISSION_SETse tiver a UNSAFE ASSEMBLYpermissão.
    3. Se estiver usando o SQL Server 2017 ou mais recente, não há necessidade de usar o recurso "assemblies confiáveis". Por favor, veja meu post aqui sobre por que e o que deve ser feito em vez disso: SQLCLR vs. SQL Server 2017, Parte 1: "CLR strict security" - The Problem . É claro que, neste caso específico, é um ponto discutível, pois a abordagem adequada é usar o método Certificate, conforme descrito acima.

    Observe que em outras respostas a perguntas semelhantes, respondidas por mim ou por outras pessoas, a resposta sempre foi que TRUSTWORTHYtinha que ser ativada. Isso ocorreu devido a informações incorretas fornecidas pela documentação da Microsoft que eu não percebi até mais recentemente. Estou trabalhando para corrigir minhas respostas anteriores e essa documentação.

    • 7
  2. SpaceGhost440
    2019-03-01T12:40:34+08:002019-03-01T12:40:34+08:00

    Esta resposta é baseada na sugestão de Salomão acima. O crédito é todo dele. Eu reescrevi meu script como ele sugeriu e agora funciona!!! TI SALOMÃO! Estou apenas postando como exemplo para outros que vierem depois de mim.

    USE master
    
    IF DB_ID('CLR_Test') IS NULL BEGIN
        CREATE DATABASE CLR_Test
    END
    GO
    
    USE [CLR_Test]
    GO
    
    EXEC sp_configure @configname=clr_enabled, @configvalue=1
    GO
    RECONFIGURE
    GO
    
    
    /*************************************************************************************/
    -- DROP OBJECTS IF FOUND FIRST
    /*************************************************************************************/
    
    -- DROP System.DirectoryServices.AccountManagement
    IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices.AccountManagement') BEGIN 
        RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices.AccountManagement]', 0, 1) WITH NOWAIT
        DROP ASSEMBLY [System.DirectoryServices.AccountManagement]
    END
    
    -- DROP System.DirectoryServices.Protocols
    IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices.Protocols') BEGIN 
        RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices.Protocols]', 0, 1) WITH NOWAIT
        DROP ASSEMBLY [System.DirectoryServices.Protocols]
    END
    
    -- DROP System.DirectoryServices
    IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices') BEGIN 
        RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices]', 0, 1) WITH NOWAIT
        DROP ASSEMBLY [System.DirectoryServices]
    END
    GO
    IF EXISTS(SELECT 1 FROM sys.database_principals dp WHERE dp.name = 'MSFT_CLR_Login') 
    BEGIN
        RAISERROR( 'DROP USER [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
        DROP USER [MSFT_CLR_Login] 
    END
    GO
    USE [master]
    GO
    IF (EXISTS(SELECT 1 FROM master.sys.syslogins WHERE name = 'MSFT_CLR_Login'))
    BEGIN
        RAISERROR( 'DROP LOGIN [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
        DROP LOGIN [MSFT_CLR_Login] 
    END
    GO
    IF (EXISTS(SELECT 1 FROM master.sys.certificates WHERE name = 'MSFT_CLR_Cert'))
    BEGIN
        --DROP ASYMMETRIC KEY [ClrKey]
        RAISERROR( 'DROP CERTIFICATE [MSFT_CLR_Cert]', 0, 1) WITH NOWAIT
        DROP CERTIFICATE [MSFT_CLR_Cert] 
    END
    GO
    
    /*************************************************************************************/
    -- CREATE THE OBJECTS
    /*************************************************************************************/
    USE [master]
    GO
    
    RAISERROR( 'CREATE CERTIFICATE [MSFT_CLR_Cert]', 0, 1) WITH NOWAIT
    CREATE CERTIFICATE [MSFT_CLR_Cert] FROM EXECUTABLE FILE = 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.dll'
    
    RAISERROR( 'CREATE LOGIN [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
    CREATE LOGIN [MSFT_CLR_Login] FROM CERTIFICATE [MSFT_CLR_Cert]
    
    RAISERROR( 'GRANT UNSAFE ASSEMBLY', 0, 1) WITH NOWAIT
    GRANT UNSAFE ASSEMBLY TO [MSFT_CLR_Login]
    GO
    
    USE CLR_Test
    GO
    
    RAISERROR( 'CREATE USER [MSFT_CLR_Login]', 0, 1) WITH NOWAIT
    CREATE USER [MSFT_CLR_Login] FOR LOGIN [MSFT_CLR_Login]
    
    
    /*************************************************************************************/
    -- CREATE THE CLR OBJECTS
    /*************************************************************************************/
    
    USE CLR_Test
    GO
    
    /****************************************************************************/
    -- [System.DirectoryServices]
    /****************************************************************************/
    CREATE ASSEMBLY [System.DirectoryServices] 
    FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.dll'
    WITH PERMISSION_SET = UNSAFE
    
    /****************************************************************************/
    -- [System.DirectoryServices.Protocols]
    /****************************************************************************/
    CREATE ASSEMBLY [System.DirectoryServices.Protocols] 
    FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.Protocols.dll'
    WITH PERMISSION_SET = UNSAFE
    
    /****************************************************************************/
    -- [System.DirectoryServices.AccountManagement]
    /****************************************************************************/
    CREATE ASSEMBLY [System.DirectoryServices.AccountManagement] 
    FROM 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.DirectoryServices.AccountManagement.dll'
    WITH PERMISSION_SET = UNSAFE
    
    • 4

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve