有关创建以System.String出它不保护你的SecureString的所有预订一边,怎么能做到呢?
如何将普通的System.Security.SecureString转换为System.String?
我相信很多熟悉SecureString的人会回应说,永远不应该将SecureString转换为普通的.NET字符串,因为它会删除所有安全保护. 我知道.但是现在我的程序用普通字符串完成所有操作,我正在尝试增强其安全性,虽然我将使用返回SecureString的API给我,但我并不是想用它来增加我的安全性.
我知道Marshal.SecureStringToBSTR,但我不知道如何取出BSTR并从中制作System.String.
对于那些可能要求知道我为什么要这样做的人,好吧,我正在从用户那里获取密码并将其作为html表单POST提交以将用户登录到网站.所以......这真的必须使用托管的,未加密的缓冲区.如果我甚至可以访问非托管的,未加密的缓冲区,我想我可以在网络流上进行逐字节流写入,并希望这样可以保证密码的安全性.我希望能够回答至少其中一种情况.
我想定期在Windows服务的指定用户帐户下运行任意.NET exe.
到目前为止,我已经让我的Windows服务运行逻辑来决定目标进程是什么,以及何时运行它.目标进程以下列方式启动:
在第一次出现这种情况,目标进程执行罚款,然后正常关闭.然而,每次后续时间,一旦目标进程启动,它就会抛出错误"应用程序无法正常运行(0xc0000142)".重新启动Windows服务将允许进程再次成功运行(第一次执行).
当然,目标是每次都成功执行目标进程.
关于上面的步骤2:要以不同的用户身份运行进程.NET调用win32函数CreateProcessWithLogonW.此函数需要一个窗口句柄来记录指定的用户.由于Windows服务未在交互模式下运行,因此它没有窗口句柄.这个中间过程解决了这个问题,因为它有一个可以传递给目标进程的窗口句柄.
请不要使用psexec或windows任务规划器的建议.我已经接受了我的生活,包括以上述方式解决问题.
所以我有一个简单的例子,我有app A,它有一些硬编码信用给用户X,一个本地管理员,然后它用这些凭证使用硬编码的绝对路径启动应用B. A和B以及dotnet控制台应用程序,但它们不与控制台交互,只是将信息写入文件.
当我进行交互(下我Creds,通过双击,或通过的CMD.exe,或交互式PowerShell会话它运行良好.成功呼叫乙
当我通过一个计划任务运行它,其中A由于信用卡,并且用用户X调用B时,Process.Start(mystartinfo)的错误代码是-1073741502或十六进制的0xC0000142,这意味着"应用程序无法正确初始化"
但是,如果我运行使用用户X凭据调用A的计划任务,它可以工作..
我做了这个小测试主要是因为我在PowerShell中从计划任务或远程处理中执行"start-job -Credential",或者在PowerShell中调用start-process或者在PowerShell中调用System.Diagnostic> Process.Start时看到类似的行为在相同的情况下.起初我认为这是PowerShell中的一个错误,但它似乎更深.无论是Windows还是特别是Dotnet,我想知道这是否已知/记录,以及是否有任何变通方法.
我有一个运行为mydomain\userA的Windows服务.我希望能够从服务中运行任意.exes.通常,我使用Process.Start()并且它工作正常,但在某些情况下我想以不同的用户(mydomain\userB)运行可执行文件.
如果我更改ProcessStartInfo,我用来启动进程以包含凭据,我开始收到错误 - 或者是一个错误对话框,显示"应用程序无法正确初始化(0xc0000142).单击确定以终止应用程序."或者"访问被拒绝"Win32Exception.如果我从命令行运行进程启动代码而不是在服务中运行它,则进程将使用正确的凭据开始(我已通过设置ProcessStartInfo来运行whoami.exe并捕获命令行输出来验证这一点) ).
我也尝试使用WindowsIdentity.Impersonate()进行模拟,但这没有用 - 据我所知,模拟只会影响当前线程,启动新进程会继承进程的安全描述符,而不是当前线程.
我在一个独立的测试域中运行它,因此userA和userB都是域管理员,并且两者都在域范围内具有"登录即服务"权限.
我正在使用PowerShell Start-Process调用遇到一种奇怪的行为.
这是电话:
$process = start-process `
"C:\somepath\MyBinary.exe" `
-PassThru `
-Credential $defaultCredential `
-Wait `
-WorkingDirectory "C:\somepath" `
-LoadUserProfile
if ($process.ExitCode -ne 0)
{
#do something
}
Run Code Online (Sandbox Code Playgroud)
此调用始终返回退出代码 - 1073741502
.
快速搜索后,当程序无法加载其所需的dll(aka.STATUS_DLL_INIT_FAILED
)时,此退出代码似乎与一般错误有关.
当我运行它没有-Credential $credential
程序正确运行.
为了隔离问题,我some.exe
在目标凭证的提示中手动启动,并且运行顺利.
所以问题似乎只来自start-process cmdlet有效启动进程的方式.
我找到了一些潜在的解决方案来解决这个问题,我尝试申请没有运气:链接和链接.
你知道这里发生了什么吗?
编辑1:
我直接或通过powershell脚本运行proc mon来监控程序活动.加载时似乎发生了这个问题kernelbase.dll
.
本地procmon转储(工作):
9:06:35.3837439 AM MyBinary.exe 2620 Load Image C:\Windows\SysWOW64\kernelbase.dll SUCCESS Image Base: 0x76270000, Image Size: 0x47000
9:06:35.4317417 AM MyBinary.exe 2620 RegOpenKey HKLM\System\CurrentControlSet\Control\Nls\Sorting\Versions REPARSE Desired Access: Read …
Run Code Online (Sandbox Code Playgroud) 使用在我的交互式会话中运行的 IIS Express 中的 System.Diagnostic.Process.Start(),我可以执行以具有校正功能的不同用户身份运行的程序。不幸的是,这似乎不适用于非交互式会话。
指定凭据时,Process.Start 在内部调用 CreateProcessWithLogonW(CPLW)。CreateProcessWithLogonW 不能从 Windows 服务环境(如 IIS WCF 服务)调用。它只能从交互式进程(由通过 CTRL-ALT-DELETE 登录的用户启动的应用程序)中调用。-从这个 SO 答案
我需要将此站点从应用程序池帐户发布到 IIS 8。所以我按照上面引用的答案的建议 CreateProcessAsUser 。我已经使用本地安全策略设置了服务帐户和代理帐户,并按照该答案中的建议重新启动 - 服务帐户可以替换令牌,修改配额,代理帐户可以批量登录(以及作为该测试的服务)。但我不能让它在IIS快递(或控制台测试应用程序)的工作,也不IIS 8.我已经试过运行的LOGON32_LOGON_BATCH
,LOGON32_LOGON_NETWORK_CLEARTEXT
以及LOGON32_LOGON_SERVICE
,甚至LOGON32_LOGON_INTERACTIVE
。我什至给了我自己的帐户“作为服务登录”和“作为操作系统的一部分”特权,没有任何变化——所有这些都在重新启动后进行了测试。
对于所有配置,我都从 IIS Express 收到“客户端不持有所需的特权”。在服务器上,我得到相同的运行控制台应用程序。但是发布应用程序,它似乎可以很好地启动该过程,但随后我似乎遇到了权限错误。
我想知道我的帐户在本地运行时缺少哪些权限,以便我可以正确调试它们(并最终找出我遇到的任何权限错误)。有什么办法可以确定吗?无论哪种方式,如果您知道问题所在,我也希望如此!
谢谢!
c# ×4
.net ×3
powershell ×2
credentials ×1
encryption ×1
iis ×1
permissions ×1
pinvoke ×1
process ×1
security ×1
service ×1
winapi ×1