我有一个 Window 10 vb.net 主进程(测试器),它需要创建一个进程来清理某些注册表区域。我们测试的产品有一个单一的 FTDI 串行端口适配器,但随着时间的推移,这些实例会逐渐增多并使注册表缓慢爬行。
当主进程开始时,希望使用现成的实用程序 DeviceCleanupCmd.exe 来搜索和删除驱动程序实例构建。这需要该子进程的管理员权限。我已经能够使用脚本在 XP 上执行此操作,但是系统以完全管理员权限运行。由于不在网络上,因此风险很小。
展望未来,我们正尝试用联网的 Windows 10 Enterprise 机器替换 XP 系统。我想将脚本的等效项合并到 vb.net 进程中,并修改了 vb.net 应用程序以使用
使用这种方法,我的子进程会执行,但没有管理员级别的权限。下面的 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 提供的错误消息:
由于应用程序抱怨目录名称无效,我特意将 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