从非管理员用户以管理员身份运行进程 - 本地管理员凭据

时间:2021-04-12 21:50:23

标签: windows vb.net .net-core

我有一个 Window 10 vb.net 主进程(测试器),它需要创建一个进程来清理某些注册表区域。我们测试的产品有一个单一的 FTDI 串行端口适配器,但随着时间的推移,这些实例会逐渐增多并使注册表缓慢爬行。

当主进程开始时,希望使用现成的实用程序 DeviceCleanupCmd.exe 来搜索和删除驱动程序实例构建。这需要该子进程的管理员权限。我已经能够使用脚本在 XP 上执行此操作,但是系统以完全管理员权限运行。由于不在网络上,因此风险很小。

展望未来,我们正尝试用联网的 Windows 10 Enterprise 机器替换 XP 系统。我想将脚本的等效项合并到 vb.net 进程中,并修改了 vb.net 应用程序以使用

  • Process() with StartInfo.Verb = "runas"
  • 应用程序提供的本地用户凭据(不是域用户)用于启动子进程。

使用这种方法,我的子进程会执行,但没有管理员级别的权限。下面的 Stackoverflow 参考说明我不能使用这种方法,必须使用 CreateProcessWithLogonW。我理解伊恩·博伊德 (Ian Boyd) 对帖子中的安全性的担忧。

Run process as administrator from a non-admin application

我已遵循 Microsoft 实施,但仍有问题。

https://docs.microsoft.com/en-us/troubleshoot/dotnet/visual-basic/start-process-as-another-user

这是我的代码的重要部分。您会看到我截断了 MS 示例以使用 W2K 部分,因为我们不会回到那么远!

    wUser = System.Text.Encoding.Default.GetString(UnicodeStringToBytes(UserName + Chr(0)))
    wDomain = System.Text.Encoding.Default.GetString(UnicodeStringToBytes(DomainName + Chr(0)))
    wPassword = System.Text.Encoding.Default.GetString(UnicodeStringToBytes(Password + Chr(0)))
    wCommandLine = System.Text.Encoding.Default.GetString(UnicodeStringToBytes(CommandLine + Chr(0)))
    wCurrentDir = System.Text.Encoding.Default.GetString(UnicodeStringToBytes(CurrentDirectory + Chr(0)))
    Result = CreateProcessWithLogonW(wUser, wDomain, wPassword, CREATE_DEFAULT_ERROR_MODE, 0&, wCommandLine, CREATE_NEW_CONSOLE, 0&, wCurrentDir, si, pi)
    If Result <> 0 Then
        CloseHandle(pi.hThread)
        CloseHandle(pi.hProcess)
        W2KRunAsUser = 0
    Else
        W2KRunAsUser = Err.LastDllError
        Status = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, CType(0&, IntPtr), W2KRunAsUser, 0, strMessage, Len(strMessage), 0)
        MsgBox("CreateProcessWithLogonW() failed with error: " & W2KRunAsUser & " " & strMessage, vbExclamation)
    End If

请记住,我的目标管理员用户仅驻留在我运行应用程序的 PC 上 - 而不是域中。我已经验证我可以使用凭据登录并成功运行 DeviceCleanupCmd.exe。为了在本地登录,我必须在用户之前使用\。运行代码时,我尝试了以下操作,并在冒号 (:) 后显示了 Windows 10 提供的错误消息:

  1. 提供“用户”、“密码”和“域”(我知道这不是必需的):目录名称无效。
  2. 将“用户”、“密码”和域提供为“”:目录名称无效。
  3. 提供“\user”、“password”和域为“”:目录名无效。
  4. 提供“.\user”、“password”和域为“”:存根收到错误数据。
  5. 提供“用户”、“密码”和域作为“计算机名”:目录名无效。
  6. 提供“非管理员用户”、“密码”和“用户域”:DeviceCleanupCmd.exe 运行但抱怨“没有可用的管理员权限”。

由于应用程序抱怨目录名称无效,我特意将 DeviceCleanupCmd.exe 放在不受 Windows 保护的 C:\sub-目录中(如程序文件)。上面的尝试 6 似乎证明不存在权利/访问冲突。

我也尝试过用 CREATE_NEW_CONSOLE 代替 CREATE_DEFAULT_ERROR_MODE,结果与上述相同。我已经证明用户正在被解码,因为当我提供错误的密码时,我得到“用户名或密码不正确”。

@Hurshey 提供了查看 Windows 任务计划程序的见解,以下链接支持完全配置任务 + 将导出的 XML 合并到 NSIS - 我的目标部署方法。

https://www.windowscentral.com/how-create-automated-task-using-task-scheduler-windows-10 https://nsis.sourceforge.io/Talk:Scheduled_Tasks

0 个答案:

没有答案