在软件开发中,保护产品的独特性是一个重要议题。开发者可能希望将自制代码与独特的硬件参数链接起来,以确保软件的独特性和安全性。一种有效的方法是读取硬盘驱动器的序列号和型号数据,以及可选的网络MAC地址。本文将介绍如何使用C++/CLI创建存储过程,以实现从存储过程访问原生C++代码的目的。
为了创建C++/CLI存储过程,开发者需要遵循以下步骤:
public ref class StoredProcedures
{
[SqlFunction(DataAccess = DataAccessKind::Read)]
static SqlString MyFunction(SqlString buffer)
{
return buffer;
}
[SqlProcedure]
static void GetHelloWorld()
{
SqlPipe^ spPipe = Microsoft::SqlServer::Server::SqlContext::Pipe;
spPipe->Send(L"Hello World");
}
}
当前不需要制作x86版本,示例仅支持x64 WinNT平台。在编译实际的程序集之前,请确保项目属性中设置了以下选项:
微软不提供设置.NET平台版本的选项。发现的唯一方法是:将项目文件作为XML文档打开,并更改为想要支持的平台。如果使用原生C++代码,则2.0版本就足够了,并且需要安装VS2008。(但可以使用任何工具集(这将在最终程序集中添加更多无用的Microsoft代码)。
<TargetFrameworkVersion>
v2.0
</TargetFrameworkVersion>
从这一刻起,一切都准备好构建一个与MSSQL Server一起运行的程序集。选择配置为Release,平台为x64,构建项目。
在注册程序集之前,必须确保MSSQL服务器准备好使用UNSAFE程序集:
SQL
CREATE DATABASE myTestDb
GO
USE master
GO
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'clr enabled', 1
RECONFIGURE
GO
USE myTestDb
GO
ALTER DATABASE myTestDb SET TRUSTWORTHY ON
GO
现在可以注册程序集:
SQL
CREATE ASSEMBLY CLIESP from 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\ClrDiskId.dll' WITH PERMISSION_SET = UNSAFE;
注册所需的存储过程作为clr存储过程:
SQL
CREATE PROCEDURE dbo.GetHelloWorld WITH EXECUTE AS CALLER AS EXTERNAL NAME CLIESP.StoredProcedures.GetHelloWorld;
GO
最后运行:
SQL
EXEC dbo.GetHelloWorld
现在已经知道如何使用C++/CLI存储过程,可以添加C++代码,并直接从存储过程中调用它。
让从显示计算机上的当前硬盘开始。使用了从WinSim读取硬盘制造信息的代码。这段代码对来说看起来不安全,所以添加了单元测试,并使代码更安全,以用于MSSQL Server这样的关键任务应用程序 - 没有人希望服务器崩溃。
附加的解决方案包含3个项目:
执行后:
SQL
EXEC dbo.GetDiskID
Id | Model | Serial | Vendor | Size [Gb] | UUID |
---|---|---|---|---|---|
0 | HDS723020BLA642 | MN1220F32AJ4PD | Hitachi | 1863 | -5791026690894825696 |
1 | WD3000HLHX-01JJPV0 | WD-WXW1E31HHMV5 | WD | 279 | 4862279922329562629 |