问题标签 [advapi32]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wix - LsaAddAccountRights 自定义操作在 Windows Server 2012 中返回错误代码
我有一个自定义操作,用于提升用户能够作为服务登录。这将在安装程序期间运行。在 Windows Server 2012 之前,它在每个 Windows 操作系统上都可以正常工作多年。当下面的代码在这个版本的 Windows 上运行而不是long
成功返回 0 时,我会得到一个不同的错误代码。
问题是代码似乎每次都不同,并且是一个非常大的数字,例如 102938473。
我通过以下方法运行错误代码以获取错误代码,但这会返回一个不同的大数字,它似乎不是有效的错误代码。
我试过查找这些错误代码,但没有运气。它们似乎是随机生成的且毫无意义。
如果我忽略返回的错误代码,则似乎已成功允许用户作为服务登录。所以一切似乎都在工作,除了我得到一个错误代码。我可以忽略这个错误代码,但是当它是一个有效错误时会发生什么,我将来可能会忽略它。
额外的信息
我可以在控制台应用程序中自行运行自定义操作中的代码而不会出错。只有当它是 wix 安装程序的一部分时,它似乎不起作用。
c# - 在服务器 2012 上使用 MS 加密库 - CryptCreateHash 错误代码 87:ERROR_INVALID_PARAMETER
我正在尝试在新的 Windows Server 2012 环境中托管 Web 应用程序,但是我收到了一个意外错误。该代码已在我们的代码库中存在多年,并且在任何其他平台上都没有遇到任何问题。
有问题的代码调用 advapi32.dll 的 CryptCreateHash 函数 - 一个 Microsoft 加密库。调用函数时返回 0 表示调用失败,随后 Err.LastDllError 返回错误代码 87,即 ERROR_INVALID_PARAMETER。
正如我之前所说,这段代码已经在各种环境中完美运行多年——包括开发人员使用的 Windows Server 2012 测试机器。但是,当放在也运行 Server 2012 的实时环境中时(尽管在负载平衡系统的稍微复杂的环境中),我收到了错误。两台服务器都尚未更新到 Windows Server 2012 R2,它正在运行开箱即用的操作系统版本。
使用以下命令创建 Crypt Provider 的句柄后:
我使用 hCryptProv 来调用 CryptCreateHas 函数。
从实时环境和开发环境传递给方法的数据的一些示例:
开发:
hCryptProv = 4966968
CALG_MD5 = 32771
hHash = 0
直播:
hCryptProv = 1587622576
CALG_MD5 = 32771
hHash = 0
看起来这两组参数基本相同,尽管服务器的 hCryptProv 往往是一个更大的数字(可能是因为它有更多的 RAM?)。
我尝试使用 SHA1 而不是 MD5,但发生了同样的错误。
可能这是一个 32/64 位相关问题,假设 advapi32.dll 是 32 位?
任何建议将不胜感激,谢谢。
编辑:
按要求提供原型:
我一直在玩数据类型phProv
,以前它是整数,我还没有使用 IntPtr 进行测试。我曾尝试使用 ULong,因为这是HCRYPTPROV
MSDN 文档中定义数据类型的方式。
这里还有 CryptAcquireContext 在各种配置中返回的句柄值:
这是从我使用整数作为数据类型开始的,请注意实时溢出。
编辑 2
这可能是固定的。现在,当我调用 CryptDecrypt 时,我收到错误 -2146893820 (NTE_BAD_LEN)。可能与*pdwDataLen
变量有关。
这是方法定义:
和电话:
c# - 使用 Pinvoke 调用 advapi.dll:CryptDecrypt 和 CryptEncrypt 意外行为
这是这个问题的后续。
我从 VB.net 调用 WinAPI Cryptography 函数,以确保与共享结果数据的旧产品兼容。
代码多年来一直运行良好,但是我最近在 Windows Server 2012 上运行时遇到了一个问题。在查看了各种示例和我之前问题的答案后,我对代码进行了大修,包括更改以前的字符串变量为字节数组,我认为这是更正确的功能。我不知道它以前是如何使用字符串的,但在修复了最初的 Server 2012 问题后,由于字符串的 NTE_BAD_LENGTH 而失败。
现在,在将字符串转换为字节数组后,代码似乎不像以前那样加密,也不会解密 CryptEncrypt 生成的内容。
代码的主要部分如下:
(在此之前调用 CryptCreateHash、CryptHashData、CryptDeriveKey)
我的方法原型定义为:
示例输出如下:
测试数据:Testing123
缓冲区中的纯文本数据:84、101、115、116、105、110、103、49、50、51,
加密:CW?? ???_
缓冲区中的加密数据:
12、67、87、133、158、9、139、250、255、95,缓冲区中的解密数据:12、67、87、133、158、9、139、250, 255, 95,
解密: CW?? ???_
如您所见,解密后缓冲区保持不变。
我不知道为什么会发生这种情况,我唯一的理论是这与我用哪个字符集编码 Byte() 有关,尽管我已经尝试了几个并且没有区别。这也可能适用于密码参数(Byte() 传递给CryptHashData
)。
任何帮助是极大的赞赏。
编辑1: 感谢您的帮助,我今天早些时候意识到缓冲区复制问题,我试图在我的测试应用程序中隔离问题,但最终使我的变量复杂化,是的。
事实上,VB 中的数组是用最高索引实例化的,所以 127 创建了一个长度为 128 的数组,我知道这很混乱。
正如您所讨论的,我相信我现在的问题在于编码。以前,数据作为 .NET 字符串传递到CryptEncrypt
/CryptDecrypt
中,而不是像我现在所做的那样首先转换为 byte()。但是我不知道非托管代码将如何处理这个字符串,大概是默认的 .NET 编码或 Windows 编码?
我已经尝试过 UTF8 和 Unicode,但是它们都不会反映原始代码的行为,也不会将以前存储的字符串加密/解密为原始值。这也是我想继续使用非托管方法以准确反映遗留行为的原因(使用非托管方法的 VB6 应用程序用于在 .NET 中解密之前生成加密数据)。
我的代码现在加密和解密,但是,正如我所说,尽管使用了相同的加密技术,但输出的值与原始数据不匹配。感谢您一直以来的帮助。
c# - c# WinServices 使用 Logindata 在窗口服务上运行程序
我正在编写一个应用程序和一个充当客户端<->服务器系统的服务。客户端正在向服务器提交数据,服务器正在调用第 3 方应用程序。在第 3 方应用程序需要访问我们的网络驱动器之前工作正常。只要第 3 方库从调用者 (LocalService) 继承登录数据并且 LocalService 不是域的一部分,应用程序就无法访问我们的网络驱动器。因此尝试在客户端获取用户域数据(这不是问题)并ProcessInfo
在服务器上模拟进程,但这失败了。经过短暂的谷歌搜索后,我发现无法在 Windows 服务中使用ProcessInfo.Username
and ProcessInfo.Password
,所以我使用了 advapi32 函数CreateProcessWithLogonW
:
这工作正常,但是当我查看服务器任务管理器时,发现第 3 方应用程序的新进程仍在使用“用户名”=“本地服务”运行。现在是否使用给定的登录数据“模拟”了该过程?
c# - 抓取非常大的文件系统的最佳策略是什么?
我需要获得分布在多个共享中的大约 100,000,000 个 Windows 网络文件的所有者。我在 C# 代码中使用 advapi32 GetNamedSecurityInfo 函数,但这是一个长期运行的过程。我目前正在并行抓取多个共享。对于每个共享,我都按顺序查询每个文件和文件夹。我的问题是,最小化抓取/收集时间的最佳方法是什么?
感谢您的回答
python - 尝试使用 ctypes 调用 wincred api
我正在尝试使用 ctypes API 读取 Windows Credential vault,但我不确定如何将函数结果转换回可用的 ctypes.Structure。
结果:
1 <__main__.LP_CREDENTIALS object at 0x012CECB0> None None
该函数返回 true ,因此它可以工作,但指针内容似乎是空白的。我究竟做错了什么?
c# - RegEnumKeyEx - 访问冲突写入位置
情况:
- 需要获取特定注册表项的所有子项的列表。
- 需要同时访问 32 位和 64 位软件密钥,所以我不能使用 Registry 命名空间。
- 在 .Net 3.5 中使用 CSharp,以及来自 advapi32.dll 的注册表功能
我的大部分功能都在工作,但我遇到了一个错误。当它到达包含值的键时,它将跳过它或抛出以下错误:
- “xxxxx.exe 中 0x00C819CD 处未处理的异常:0xC0000005:访问冲突写入位置 0x00720077。”
如果发生错误,它不会出现在我的任何一个 catch 语句中。它很难使程序崩溃。从我在论坛上读到的内容来看,我认为写入受保护内存可能是个问题,但我看到的所有示例都是针对 C++
我的声明(来自 P/Invoke Interop Assistant):
我的功能(显然是一项正在进行的工作,所以有点乱):
c# - C# PInvoke CryptImportKey 因“指定的类型无效”而失败
我正在尝试使用 CryptImportKey 函数将 PFX 导入 Gemalto .NET IDPrime 智能购物车,但我收到“指定的类型无效”(2148073482) 错误。我怀疑 RSACryptoServiceProvider.ExportCspBlob(true) 调用以错误的格式返回密钥。我正在使用来自http://www.idrix.fr/Root/Samples/PfxImporter.cs的示例代码。注意:我已经将 Microsoft Base Smart Card Crypto Provider 的 AllowPrivateExchangeKeyImport 和 AllowPrivateSignatureKeyImport 设置为 0x1,但仍然没有变化。我正在运行 Windows Server 2012,但不认为这是问题所在。
有人可以告诉我这个代码示例有什么问题吗?
c# - 从 C# 调用 Advapi32.dll 本机 EventWrite 函数?
我正在尝试使用 C# .Net 来触发 Window 的Service Trigger Events。
具体来说,我正在尝试触发此事件,以便从非特权帐户启动 WebClient 服务。
我能够在 C++ 中找到有关启动服务的参考,但不确定如何在 C# 中实现相同的功能:
这是我正在使用的代码:
调用EventWrite
引发PInvokeStackImbalance
异常。这可能是我的EVENT_DESCRIPTOR
结构错误吗?
这是原生Event_Descriptor的结构:
这是我的 C# 结构:
这是原生EventWrite函数的结构:
这是我对事件写入的 PInvoke 调用:
这是我正在抛出 PInvokeStackImbalance 异常的调用: