gpt4 book ai didi

c# - securestring 如何编码为非托管代码?

转载 作者:行者123 更新时间:2023-11-30 19:14:06 26 4
gpt4 key购买 nike

提出这个问题的原因:我正在尝试更改运行 Windows 服务的帐户。我决定使用 win32 api 而不是 WMI,并开始查看 ChangeServiceConfig。

我想我可以简单地在非托管方法签名中使用 SecureString 类型,它会工作得很好。嗯,不完全是。这让我想知道,有谁知道 SecureString 类被编码为(默认)非托管代​​码的原生 (win32) 类型?

最佳答案

我从来没有得到标题中问题的答案,所以我仍然不知道 SecureString 是否编码为非托管代码。

但是,我确实通过使用其他一些答案中的建议让我的代码正常工作。我提供了以下代码。

internal static class NativeService
{
...
[DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ChangeServiceConfig(IntPtr hService, uint nServiceType, uint nStartType, uint nErrorControl, string lpBinaryPathName, string lpLoadOrderGroup, IntPtr lpdwTagId, [In] char[] lpDependencies, string lpServiceStartName, IntPtr lpPassword, string lpDisplayName);
...
public const uint SERVICE_NO_CHANGE = 0xffffffff;
}

internal class ClassThatConfiguresService
{
...
public void ConfigureStartupAccount(IntPtr service, string userName, SecureString password)
{
passwordPointer = Marshal.SecureStringToGlobalAllocUnicode(password);
try
{
if(!NativeService.ChangeServiceConfig(service, NativeService.SERVICE_NO_CHANGE, NativeService.SERVICE_NO_CHANGE, NativeService.SERVICE_NO_CHANGE, null, null, IntPtr.Zero, null, userName, passwordPointer, null))
throw new Win32Exception(Marshal.GetLastWin32Error());
}
finally
{
Marshal.ZeroFreeGlobalAllocUnicode(passwordPointer);
}
}
...
}

我使用了 Marshal.SecureStringToGlobalAllocUnicode 而不是 Marshal.SecureStringToBSTR,因为那是非托管函数所期望的,但除此之外它还算不错。

希望其他人觉得这很有用。保持。

关于c# - securestring 如何编码为非托管代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1508082/

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