在 vb.net 中以不同用户身份运行新进程

2024-01-02

我目前正在使用一种自行开发的方法在 Vista 中以不同用户的身份运行一个进程,我无法摆脱这样的感觉:它是黑客式的且不太理想(除了它会导致 UAC 崩溃,使我的电脑崩溃)的感觉。应用程序出现安全异常,并迫使我完全禁用 UAC)。我的流程由两个项目(即两个 EXE 文件)组成 - 一个“界面”和一个“启动存根” - 流程如下:

  1. 用户有一个启动“Interface.exe notepad.exe”的快捷方式
  2. Interface.exe 有一个表单,要求提供他们想要使用的凭据
  3. Interace.exe 使用 ProcessStartInfo 创建 LaunchStub.exe (LS) 的实例作为新用户
  4. LS 使用 ProcessStartInfo(将 ShellExecute 设置为 true)来启动请求的文件,并且由于它已经作为请求的用户运行,因此新进程也是如此。

我采用两步流程的原因是,我希望用户能够右键单击操作系统具有默认操作的任何文件(.EXE、.SQL、.MSC 等)并启动它,并且仅限 ProcessStartInfo支持启用“UseShellExecute”,但该开关阻止我使用新的凭据,因此我一次只能执行一个操作。

这会导致一些问题 - 首先,用户必须已经存在于计算机上,这意味着他们之前必须在本地登录。如果该用户没有本地配置文件,则请求的应用程序有时会启动,但我会收到注册表和配置文件异常,因为应用程序期望尚不存在的东西(例如注册表中的 HKCU 配置单元,用户不存在)因为他们从未登录过)。

我知道我应该能够将我的应用程序的权限“提升”给他们请求的用户,启动我的新进程,然后撤消提升,但我无法为此找到一个好的代码示例,并且我不确定它是否允许以完全不同的用户身份运行。这一切有意义吗?我只是忍不住觉得有更好的方法来做到这一点。


UPDATE:我刚刚尝试过一些模拟代码 http://weblogs.asp.net/ralfw/archive/2003/11/24/39479.aspx我在网上找到了,但没有效果。当与 ProcessStartInfo 结合使用时,它似乎仍然使用我当前的登录名(而不是我提供的登录名)启动进程,即使我已使用提供的凭据激活了模拟。


您很可能必须使用 Win32 API 创建自己的“shell”函数。

使用 CreateProcessWithLogonW API,您可以在不同的凭据下创建新进程,并可选择加载用户配置文件信息。

在下面的代码片段中如果替换

  • 用户名 - 使用您的用户名
  • 域 - 使用您的域或“vbNullString”
  • 密码 - 用您的密码
  • 参数 4 - 将 0 替换为“LOGON WITH PROFILE”以加载指定的用户配置文件。

请参阅文档CreateProcessWithLogonW API http://msdn.microsoft.com/en-us/library/ms682431(VS.85).aspx了解更多详情。走这条路,您可以完全控制并承担启动应用程序的全部责任。

同样,这只是一个示例,您可能需要稍微尝试一下才能让它执行您想要的操作。


Imports System.Runtime.InteropServices

Public Module modShell

    <StructLayout(LayoutKind.Sequential)> _
    Public Structure STARTUPINFO
        Public cb As Integer
        Public lpReserved As String
        Public lpDesktop As String
        Public lpTitle As String
        Public dwX As Integer
        Public dwY As Integer
        Public dwXSize As Integer
        Public dwYSize As Integer
        Public dwXCountChars As Integer
        Public dwYCountChars As Integer
        Public dwFillAttribute As Integer
        Public dwFlags As Integer
        Public wShowWindow As Short
        Public cbReserved2 As Short
        Public lpReserved2 As Integer
        Public hStdInput As Integer
        Public hStdOutput As Integer
        Public hStdError As Integer
    End Structure

    <StructLayout(LayoutKind.Sequential)> _
    Public Structure PROCESS_INFORMATION
        Public hProcess As IntPtr
        Public hThread As IntPtr
        Public dwProcessId As Integer
        Public dwThreadId As Integer
    End Structure

    Public Declare Unicode Function CreateProcessWithLogonW Lib "Advapi32" (ByVal lpUsername As String, ByVal lpDomain As String, ByVal lpPassword As String, ByVal dwLogonFlags As Int32, ByVal lpApplicationName As String, ByVal lpCommandLine As String, ByVal dwCreationFlags As Int32, ByVal lpEnvironment As IntPtr, ByVal lpCurrentDirectory As String, ByRef si As STARTUPINFO, ByRef pi As PROCESS_INFORMATION) As Integer
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As IntPtr) As Integer

    Public Const LOGON_WITH_PROFILE As Int32 = &H1;

    Public Const NORMAL_PRIORITY_CLASS As Int32 = &H20;&

    Public Const STARTF_USESHOWWINDOW As Int32 = &H1;
    Public Const SW_HIDE As Int16 = 0
    Public Const SW_SHOW As Int16 = 5

    Public Function Shell(ByVal strCmdLine As String, ByVal strCurrentDirectory As String) As Boolean

        Dim pi As PROCESS_INFORMATION
        Dim si As New STARTUPINFO

        si.cb = Marshal.SizeOf(si)
        si.dwFlags = STARTF_USESHOWWINDOW
        si.wShowWindow = SW_SHOW

        Dim result As Integer = CreateProcessWithLogonW("username", "domain", "password", 0, vbNullString, strCmdLine, NORMAL_PRIORITY_CLASS, IntPtr.Zero, strCurrentDirectory, si, pi)

        If result <> 0 Then
            Call CloseHandle(pi.hThread)
            Call CloseHandle(pi.hProcess)
        Else
            Return False
        End If

        Return True

    End Function

End Module

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 vb.net 中以不同用户身份运行新进程 的相关文章

  • 如何覆盖/更新当前由 IIS 提供服务的文件?

    问题 我的公司每月发布一份时事通讯 我将其托管在我们的内部网站上 我有一个供时事通讯作者上传最新版本的页面 作者上传最新的新闻通讯后 他会发送一封广播电子邮件来宣布新的新闻通讯 员工总是会检查新的时事通讯并向作者发送反馈以及需要进行的更正
  • 如何在 VB.NET 中单击按钮切换表单语言?

    我想创建本地化应用程序并想要实现语言切换器 例如特殊按钮 我使用 Visual Studio 2010 Express VB NET 我创建了带有一个标签和一个按钮的简单测试应用程序 我将表单的属性 Localized 设置为 True 并
  • 如何在一个文本框中搜索多个值并在 DataGridView vb.net 中显示

    有没有一种方法可以在一个文本框中搜索 过滤多个值 我正在 OPIS 列中搜索两个或多个不同的单词 短语 Example 搜索 sveder 然后搜索 din 374 然后搜索 TiN 结果将是具有此描述的所有项目 我有这段代码 但是当搜索与
  • WCF 模拟和 SQL 可信连接?

    我们有一个托管在 IIS7 下的服务 SQL 服务器的连接字符串设置为 受信任 为了进行身份验证 我需要在服务上设置模拟并让客户端启动模拟连接 有没有办法不设置模拟并仍然允许服务通过可信连接登录到 SQL Server 我们希望避免让客户端
  • 跨线程操作无效 VB.NET

    我浏览了该网站 发现与该主题相关的问题是针对 C 的 我正在维护的应用程序是用 VB NET 编写的 因此 如果我忽略了一个问题 我深表歉意 这是我调用我的线程的地方 Private Sub saveBtn Click ByVal send
  • string() 类型的值无法转换为字符串

    我不断收到此错误 我尝试了所有可能的方法 但它仍然显示 String 的值类型无法转换为字符串 这是代码 Private Sub Label1 Click sender As Object e As EventArgs Handles La
  • asp.net vb 用户控件在调用页面上引发事件

    我正在尝试了解用户控件 我创建了一个具有文本框和按钮的用户控件 我想要做的是 当我单击用户控件中的按钮时 在 aspx 页面中填充标签 我知道我可以在页面上有一个按钮 使用用户控件上的一些属性来获取该信息 但我想知道如何使用用户控件的按钮来
  • 如何使用鼠标拖动和移动winform

    我知道如何通过添加以下代码来 拖动和移动 winform Protected Overrides Sub WndProc ByRef m As Message If m Msg 163 And ClientRectangle Contain
  • 为什么在按下 Tab 键之前​​不显示焦点矩形?

    我有一个奇怪的问题 可能只是为了理解 为什么在测试应用程序中 直到我按 Tab 键才显示焦点矩形 我想显示一个带有两个单选框和两个按钮的对话框 当我显示对话框时 我希望在第一个单选按钮周围看到一个焦点矩形 以便用户可以看到焦点在哪里 我对控
  • 您可以传递“类型”作为参数吗?

    我想在 VB NET 中做类似以下的事情 可以吗 Function task value as Object toType as Type Return DirectCast value toType End Function 是的 有系统
  • 命令式代码与声明式代码[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我试图理解命令式范例和声明式范例之间的区别 因为我必须对 Visual Basic 进行分类 NET 在不同的范式中 除了面向对象之外
  • 我刚刚在 Visual Basic 中运行的 COM 对象的 CLSID 是什么

    我需要知道我刚刚运行的 COM 对象的 CLSIDCreateObject xxx xxx 我怎么才能得到它 蒂亚 拉法尔 我认为您无法直接从 VB 本身获取该信息 例如 作为调用的副作用或次要结果 CreateObject 但你可以阅读注
  • VB SQL 语句未选择正确的行

    我试图使用 SELECT 语句在我的数据库中 选择 一个人 但它没有选择正确的人 我也不确定为什么 我正在使用访问数据库 数据库连接代码 Imports System Data OleDb Module Database Connectio
  • 调用退出后应用程序未退出

    我有一个小问题 我似乎无法弄清楚 我正在将 DataGridView 它的内容 保存到 xls 文件中 我这样做没有任何问题 除了在我的任务管理器中它仍然显示它正在运行 我已致电 xlApp Application Quit 这被声明为 D
  • .NET 图形重影

    我正在为我们正在开发的新应用程序制作一个示例 GUI 我已经决定了语言 但我可以使用任何第 3 方 DLL 或插件或任何我需要的东西 以使 GUI 尽可能无缝地工作 他们希望它非常像 mac ubuntu vista Windows 7 所
  • DataTable:通过 LINQ 或 LAMBDA 进行动态 Group By 表达式

    我有一个数据表 我想在其中对未指定数量的字段进行分组 发生这种情况的原因是用户可以选择他想要分组的字段 所以 实际上 我将选择推入列表中 在这个选择上 我必须对我的数据表进行分组 想象一下这段代码 VB 或 C 都一样 public voi
  • LinqToSql 声明和实例化 DataContext 最佳实践?

    设置 DataContext 以便在扩展 LinqToSql 类中轻松访问方面的最佳实践是什么 例如 我的 dbml 中有一个 User 实体 我想向该类添加方法 如下所示 Partial Public Class User Public
  • 如何从 C# 运行 PowerShell 脚本

    我正在尝试使用 C 运行 PowerShell 脚本 但没有成功 这是我的功能 private void ExecutePowerShellCommand string scriptfile RunspaceConfiguration ru
  • 下载需要使用 vb.net/c# 进行身份验证的文件?

    与 CSV 文件类似 可以从以下位置下载http download finance yahoo com d quotes csv s RHT 如何下载需要身份验证的文件 我可以简单地使用 My Computer Network Downlo
  • 管理调试和发布连接字符串

    在 NET SQLServer 应用程序中管理调试和发布连接字符串的好方法是什么 我有两个 SQL Server 一个是生产服务器 一个是构建 调试服务器 我需要一种在部署 ASP NET 应用程序时在这两个服务器之间进行切换的方法 目前

随机推荐

  • 获取iframe的文档对象

    我正在尝试获取 iframe 的文档对象 但我在 google 上搜索到的示例似乎都没有帮助 我的代码如下所示
  • 追加到 /etc/apt/sources.list

    我正在创建一些脚本来简化应用程序安装 我需要附加到 etc apt sources list 的末尾 下面的代码附加到 中的文件 但不附加到 etc apt 中 echo deb http ppa launchpad net person
  • 如何获取 JavaScript 对象的大小?

    我想知道 JavaScript 对象占用的大小 取以下函数 function Marks this maxMarks 100 function Student this firstName firstName this lastName l
  • ReactJS 中的登录页面与单页应用程序 (SPA) 分离

    我正在 ReactJS 中开发一个单页面应用程序 SPA 我想知道如何在单独的页面中拥有登录页面 我在用create react app作为我的应用程序的基础 我目前正在定义 SPA 的模板App js文件 以及不同 js 文件中的每个组件
  • 验证错误后重定向到操作

    如果我有通常的 编辑 操作 则 GET 操作可以通过对象的 ID 检索对象并将其显示在编辑表单中 接下来 POST 获取 ViewModel 中的值并更新数据库中的对象 public virtual ActionResult Edit in
  • 基于深色模式的 Tailwind 颜色

    有没有办法在顺风配置中定义不同的颜色 以便在不使用深色模式的情况下应用深色模式dark选择器 目前我有一个像这样的对象 const colors light red 100 880808 dark red 100 red I d like只
  • 对数组数字(包括作为字符串的数字)求和的函数

    我有一个函数需要对数组中的所有数字求和 如果这些数字是字符串 1 2 该函数也需要对它们求和 我编写了一个函数并尝试解析数字 但它不起作用 基本上 它需要将所有数字相加 你能在不使用的情况下做到这一点吗reduce 我需要一个简单的解决方案
  • YUI Compressor Maven Mojo 缩小 javascript 的使用

    我在做一个struts2项目 使用maven来编译 我正在尝试缩小位于不同位置的 javascript 文件
  • JMeter 响应时间与线程图 - 数据点

    该图使用什么数据点 该图表示 TTFB 到第一个字节的时间 还是 TTLB 到最后一个字节的时间 以下是设置 该图表示 TTLB 到最后一个字节的时间 因为它使用 JMeter 的响应时间 如果你想要TTFB 第一个字节的时间 你需要使用L
  • 出现“无法对 Null 值调用此方法或属性”错误

    更新1 该行抛出异常 client group details Add new ClientGroupDetails 原问题 我有以下代码 我已将其从数据库中的 30 列数据精简为仅 2 列 每当任何列返回 NULL 值时 我都会收到错误
  • Kendo Grid 可以一直处于编辑模式吗?

    有谁知道剑道网格是否可以始终设置为编辑模式 我们不希望用户单击单元格或按钮来激活编辑模式 我们希望小部件始终显示并可用 有可能吗 除了使用批量编辑模式之外 您还可以尝试设置每列的模板并使用 MVVM 将输入元素绑定到数据项 grid ken
  • Android模拟器运行后如何获取序列号或ID?

    如果我在一台机器上运行多个带有 no window 选项的模拟器 命令 adb devices 显示 List of devices attached emulator 5554 device emulator 5556 device em
  • React,页面刷新后使用 useEffect 丢失 localStorage 中保存的数据[重复]

    这个问题在这里已经有答案了 这可能是一个菜鸟问题 但我遇到了一些麻烦useEffect 钩 我有一个记笔记应用程序 我想让数据持久保存 我用的是2useEffects 一个用于第一次刷新 加载页面时 另一个用于当我向应用程序添加新注释时 我
  • Struts2静态数据存储/访问

    我试图找到 静态 全局 的通常设计 方法是什么 Web 应用程序中的数据访问 存储 我使用的是 struts 2 背景 我有许多要在我的 Web 应用程序中显示的表格 问题1 这些表只会在服务器上每天更改和更新一次 我不想访问数据库 或为每
  • 如何从 Android Studio 构建产品风格?

    我在 build gradle 中定义了一些产品风格 我能够使用成功构建它们gradlew 我不知道如何从 Android Studio IDE 中执行此操作 我的项目最初是在 Eclipse 中完成的 后来我迁移到了 Android St
  • java.time 相当于 Joda-Time `withTimeAtStartOfDay`? (获取当天的第一时刻)

    In the 乔达时间 http www joda org joda time 图书馆 DateTime http www joda org joda time apidocs org joda time DateTime html类提供了
  • 在图书馆项目中链接 ThemeDictionaries

    我创建了2个ResourceDictionary 主题文件在Themes文件夹名为Light xaml and Dark xaml Added SolidColorBrush有名字BgColor在两个文件中
  • AJAX POST 到 MVC 控制器显示 302 错误

    我想在我的 MVC 视图中执行 AJAX POST 我写了以下内容 视图中的脚本代码 media search click function var data key search query val ajax type POST url
  • 如何从android中的超链接文本中删除下划线?

    我有 Button 及其文本 我从 string xml 检索它 即 我已经在 strings xml 的 res values 中声明了一个按钮文本 例如
  • 在 vb.net 中以不同用户身份运行新进程

    我目前正在使用一种自行开发的方法在 Vista 中以不同用户的身份运行一个进程 我无法摆脱这样的感觉 它是黑客式的且不太理想 除了它会导致 UAC 崩溃 使我的电脑崩溃 的感觉 应用程序出现安全异常 并迫使我完全禁用 UAC 我的流程由两个