我真的想找到一种方法来调用 OpenTokenByLogonId() 函数,但我很困惑。此外,我在任何地方都找不到任何例子!
从 MSDN 中,可以在从 SpInitialize() 函数接收的 LSA_SECPKG_FUNCTION_TABLE 函数表中找到指向 OpenTokenByLoginID() 的指针。
根据我想要做的,从几个 DLL 中实现的 SpLsaModeInitialize() 函数接收到的指向 SpInitialize() 函数的指针。
因此,我在 windows\system32\ 中寻找 SpLsaModeInitialize() 导出,并找到了一些 DLL。其中我选择使用 Kerberos.dll。我必须说,我之所以选择这个 DLL 而不是其他人,只是因为它的名字——我真的不明白有什么区别(我相信这些我不同的身份验证方法,但我真的不知道)。
所以,我得到了一个指向 SpLsaModeInitialize() 的指针:
#include <Windows.h>
#include <Sspi.h>
#include <Ntsecapi.h>
#include <Ntsecpkg.h>
HMODULE hdll_kerberos = ::LoadLibrary(L"kerberos.dll");
SpLsaModeInitializeFn SpLsaModeInitialize = (SpLsaModeInitializeFn)::GetProcAddress(hdll_kerberos, "SpLsaModeInitialize");
调用函数:
ULONG pckver = 0;
PSECPKG_FUNCTION_TABLE pck_tbl = 0;
ULONG pcTables = 0;
NTSTATUS res=0;
if(SpLsaModeInitialize(SECPKG_INTERFACE_VERSION, &pckver, &pck_tbl, &pcTables) != 0){ // error }
现在我可以使用 pck_tbl->Initialize 调用 SpInitialize。
但是(这就是问题所在)我找不到函数参数的方法!
NTSTATUS SpInitialize(__in ULONG_PTR PackageId, __in PSECPKG_PARAMETERS Parameters, __in PLSA_SECPKG_FUNCTION_TABLE FunctionTable);
如何找到 packageID 更不用说它的 SECPKG_PARAMETERS 了?我到处寻找,但我想我错过或忽略了一些东西......
感谢您的帮助!!!