0

我真的想找到一种方法来调用 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 了?我到处寻找,但我想我错过或忽略了一些东西......

感谢您的帮助!!!

4

1 回答 1

0

正如Luke所说,这个函数并没有被调用,但是当为LSA实现SSP/AP时,可以实现这个函数。

于 2014-03-06T12:49:56.210 回答