gpt4 book ai didi

sql-server - 如何为自定义 SQL Server 扩展存储过程创建简单的 DLL?

转载 作者:行者123 更新时间:2023-12-03 09:53:17 32 4
gpt4 key购买 nike

我使用的是旧版本的 SQL Server (2000)。我不希望我的用户有权运行 master.dbo.xp_cmdshell。我正在尝试创建一个自定义 DLL,我可以使用它来创建我自己的扩展存储过程,我授予用户运行权限 - 一个硬编码以执行用户需要能够按需运行的特定批处理文件。

我正在使用 Visual Studio 2010 创建 DLL。这是我的头文件 stdafx.h:

#define WIN32_LEAN_AND_MEAN 

#include <windows.h>
#include <iostream>

#ifndef INDLL_H
#define INDLL_H

#ifdef EXPORTING_DLL
extern __declspec(dllexport) void HelloWorld() ;
#else
extern __declspec(dllimport) void HelloWorld() ;
#endif
#endif

这是我的主文件 dllmain.cpp:

#include "stdafx.h"
#define EXPORTING_DLL

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{ return TRUE; }

void HelloWorld() {
system("f:\\bin\\batchfilename.bat");
}

当我尝试调试该项目时,我看到构建成功,但出现错误“无法启动程序:<已编译的 dll 的路径>”。您认为此 DLL 是否有效?如果有效,我如何测试它以亲自查看它是否有效?

最佳答案

好的,经过几个小时的谷歌搜索,我成功地编译了一个 DLL 以添加为 SQL Server 2000 扩展存储过程。我将在这里分享它,因为它只是我从谷歌搜索中整理出来的东西的汇编。 (我使用的是 Visual Studio 2010)。我不打算发布所有内容 - 我首先在 Visual Studio 中创建一个新项目并选择 Win32 控制台应用程序,然后选择下一步,然后选择 DLL。它会为您创建一些头文件和其他文件。其中一些我认为没有必要。还有一些头文件你必须手动添加到项目中。但这是我的主要 .cpp 代码:

#include "stdafx.h"         
#include "srv.h" //Must get from C:\Program Files (x86)\Microsoft SQL Server\80\Tools\DevTools\Include
#include "shellapi.h" //need for ShellExecute
#include "string" //needed for std:string
#include <sys/stat.h> //need for stat in fileExists function below

#define DLL_FUNC extern "C" __declspec (dllexport)

__declspec(dllexport) ULONG __GetXpVersion() {
return ODS_VERSION;
}

bool fileExists(const std::string& filename) {
struct stat buf;
if (stat(filename.c_str(), &buf) != -1)
{ return true; }
return false;
}

DLL_FUNC int __stdcall RunPP() {
if (fileExists("C:\\FileOnServer\\execute.bat")) {
ShellExecute(NULL,TEXT("open"), TEXT("C:\\FileOnServer\\execute.bat"), NULL, NULL,SW_SHOWNORMAL);
return 0;
} else {
MessageBox(HWND_DESKTOP, TEXT("File not found."), TEXT("Message"), MB_OK);
return 1;
}
}

我了解到您可以从命令行使用 rundll32(rundll32 yourdllname.dll,functionname {逗号后无空格})测试此 DLL,但前提是您在其中包含 .def 文件你的项目。我的 def 文件是

LIBRARY
EXPORTS
RunPP

此外,作为 documentation状态,我尝试在项目 > 属性... > 链接器 > 输入 > 附加依赖项中添加对 Opends60.lib 的引用,但看起来它在某个时候被删除了。

对于像我这样的新手,我必须在项目的属性页面中学习很多东西,例如将 C/C++ > 代码生成 > 运行时库切换到/MD。还学习如何在 Release 模式下编译,在哪里找到生成的 .dll 文件等。

然后,当将已编译的 DLL 移动到我的 SQL Server 机器 (Win2003R2) 时,我必须安装 VC++ 2010 Redistributable 才能运行。然后我将 DLL 复制到我机器上的 C:\Program Files\Microsoft SQL Server\MSSQL\Binn(xp_cmdShell 扩展存储过程的 DLL 所在的同一位置),然后根据文档运行 sp_addextendedproc 以将其注册为可用的扩展存储主数据库中的过程。然后授予用户执行它的权限等。

我知道这一切都是旧技术。我应该升级我的 SQL Server 版本。但这也许会对其他人有所帮助。

关于sql-server - 如何为自定义 SQL Server 扩展存储过程创建简单的 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12749210/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com