VB6:跨所有用户会话的单实例应用程序

2023-11-25

我有一个应用程序需要成为 Windows PC 上所有用户会话的单实例应用程序。到目前为止,我的研究主要集中在使用互斥锁来完成此任务,但我遇到了一个问题,我不确定这是否真的是一个问题,我相信这确实是一个最佳实践问题。

首先是代码:

Private Const AppVer = "Global\UNIQUENAME" ' This is not what i am using but the name is unique

Public Sub Main()

    Dim mutexValue As Long

    mutexValue = CreateMutex(ByVal 0&, 1, AppVer)
    If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
        SaveTitle$ = App.Title
        App.Title = "... duplicate instance."
        MsgBox "A duplicate instance of this program exists."
        CloseHandle mutexValue
        Exit Sub
    End If
    ' Else keep on truckin'

现在,基于this我相信我明白,通过将 NULL 指针传递给上面的 CreateMutex 函数,我基本上分配了与当前登录用户关联的任何安全描述符。

如果这意味着我的想法(我可能需要更多指导),那么其他登录用户将无法“看到”在原始用户会话下创建的互斥锁,也无法创建互斥锁。同名的互斥体。

现在,经验证据似乎支持了这一点。我使用消息框弹出我收到的“LastDLLError”,当另一个用户尝试启动该应用程序时(虽然它已经在另一个用户帐户下运行),我会收到 ERROR_ACCESS_DENIED 代码。我可以对此进行测试以及 ERROR_ALREADY_EXISTS 代码,并且只需退出即可。然而,这感觉有点黑客,我想知道是否有人可以提出替代方案。 “正确”的做法似乎是将正确的指针传递给 CreateMutex 函数,以便任何用户都有适当的权限来查看任何现有的互斥体(mutices?),但我不太确定如果没有当前的互斥体,这是否可能登录用户是管理员(这是不可接受的)。非常感谢任何帮助/指导。提前致谢!


您不需要管理员权限即可设置您自己的互斥体的安全性。这是一个简单的演示应用程序,基本上让每个人/完全控制互斥体。

Option Explicit

Private Const STANDARD_RIGHTS_REQUIRED              As Long = &HF0000
Private Const SYNCHRONIZE                           As Long = &H100000
Private Const MUTANT_QUERY_STATE                    As Long = &H1
Private Const MUTANT_ALL_ACCESS                     As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or MUTANT_QUERY_STATE)
Private Const SECURITY_DESCRIPTOR_REVISION          As Long = 1
Private Const DACL_SECURITY_INFORMATION             As Long = 4

Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare Function OpenMutex Lib "kernel32" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function InitializeSecurityDescriptor Lib "advapi32.dll" (pSecurityDescriptor As Any, ByVal dwRevision As Long) As Long
Private Declare Function SetSecurityDescriptorDacl Lib "advapi32.dll" (pSecurityDescriptor As Any, ByVal bDaclPresent As Long, pDacl As Any, ByVal bDaclDefaulted As Long) As Long
Private Declare Function SetKernelObjectSecurity Lib "advapi32.dll" (ByVal Handle As Long, ByVal SecurityInformation As Long, pSecurityDescriptor As SECURITY_DESCRIPTOR) As Long

Private Type SECURITY_DESCRIPTOR
    Revision            As Byte
    Sbz1                As Byte
    Control             As Long
    Owner               As Long
    Group               As Long
    pSacl               As Long
    pDacl               As Long
End Type

Private Const MUTEX_NAME            As String = "Global\20b70e57-1c2e-4de9-99e5-20f3961e6812"

Private m_hCurrentMutex         As Long

Private Sub Form_Load()
    Dim hMutex          As Long
    Dim uSec            As SECURITY_DESCRIPTOR

    hMutex = OpenMutex(MUTANT_ALL_ACCESS, 0, MUTEX_NAME)
    If hMutex <> 0 Then
        Call CloseHandle(hMutex)
        MsgBox "Already running", vbExclamation
        Unload Me
        Exit Sub
    End If
    m_hCurrentMutex = CreateMutex(ByVal 0&, 1, MUTEX_NAME)
    Call InitializeSecurityDescriptor(uSec, SECURITY_DESCRIPTOR_REVISION)
    Call SetSecurityDescriptorDacl(uSec, 1, ByVal 0, 0)
    Call SetKernelObjectSecurity(m_hCurrentMutex, DACL_SECURITY_INFORMATION, uSec)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If m_hCurrentMutex <> 0 Then
        Call CloseHandle(m_hCurrentMutex)
        m_hCurrentMutex = 0
    End If
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB6:跨所有用户会话的单实例应用程序 的相关文章

  • pthread_mutex_t 可以在内存中移动吗?

    我想构建一个动态分配的 pthread mutex 数组 该数组将随着时间的推移而增长 添加更多互斥体 我的问题是 如果数组通过 realloc 移动 它们是否仍然有效 我担心的是 pthread mutex init 可能会以某种方式设置
  • 有没有便宜或免费的 VB6 编程 IDE? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 VB6 中什么时候必须将变量设置为“Nothing”?

    在我的一个 VB6 表单中 我创建了几个其他 Form 对象并将它们存储在成员变量中 Private m frm1 as MyForm Private m frm2 as MyForm Later Set m frm1 New MyForm
  • if 块内 std::lock_guard 的范围

    目前正在研究关于std mutex并希望得到一些帮助 如果我有一个看起来像这样的代码 if returnBoolValue std lock guard
  • 如何将 Citrix 中的 C# 程序实例限制为每用户 1 个

    我有一个带有 C 代码的 Windows 窗体应用程序 如下所示 针对 NET Framework 4 在我的开发人员工作站上 此代码可以阻止我启动该程序的多个实例 但是 QA 有一个 Citrix 测试环境 每个用户仍然能够启动多个实例
  • VB6 UDT 自检

    我有一种感觉 这个问题的答案将是 不可能 但我会尝试一下 我的处境并不令人羡慕 需要修改旧版 VB6 应用程序并进行一些增强 转换为更智能的语言不是一个选择 该应用程序依赖大量用户定义类型来移动数据 我想定义一个通用函数 它可以引用任何这些
  • 添加 Windows Common Controls 6.0 时对象库未注册

    我正在尝试在 Windows 7 32 位计算机上安装 Visual Studio 6 操作系统安装是从裸机进行的 我按照提到的说明进行操作here http www fortypoundhead com showcontent asp a
  • 更新 KB 2687323 后,VB6 IDE 无法加载 MSCOMCTL.OCX

    Windows 更新安装安全更新后KB2687323 http support microsoft com kb 2687323 我的 VB6 项目无法加载 显示的错误消息是 无法加载 project vbp path MSCOMCTL O
  • boost::shared_mutex 多读取器/单写入器互斥体

    我正在尝试使用 boost shared mutex 来实现多读取器 单写入器互斥体 我的问题相当简单 当另一个线程尝试锁定共享互斥体进行写入时 线程是否有可能获得对共享互斥体的读取器访问权限 例如 我有10个线程 只有其中一个可以写 线程
  • 如何从 VB-6 旧应用程序中启动屏幕键盘程序

    我正在尝试从 Windows 10 32 或 Windows 10 64 位计算机上的 VB 6 应用程序中 shell osk exe 过去我们只是简单地使用 Private Sub Command1 Click Dim strTemp
  • VB6 和 .PFX 代码签名

    我的老板已经从 Comodo 获得了证书 而我一直在努力寻找获得证书问题的解决方案intoVB6 应用程序 证书本身是 VB6 格式的 我对这类事情几乎一无所知 Comodo 的人真是太乐于助人了 我的老板说他可以在互联网上找到一些东西 显
  • 如何在 .NET 中操作 VB6 集合?

    我目前正在为 NET 软件设计一个接口 该接口将由 COM 对象 特别是 VB6 使用 虽然我找到了 Microsoft 的许多页面 详细介绍了如何创建 COM 互操作接口 但我目前在设计时对 Collections 的使用感到困惑 我希望
  • 除非链接到 pthreads,否则不会出现死锁?

    为什么创建 std mutex 死锁实际上不会导致死锁 除非程序链接到 pthreads 以下内容在与 pthreads 库链接时会死锁 如果未链接 pthreads 则不会死锁 在 gcc 和 clang 上测试 clang main c
  • VB6 - Lua 集成

    我想知道是否有人有任何集成 Lua 和 VB6 的技巧 我正在运行一个小型在线角色扮演游戏 添加一些脚本会很棒 嗯 这是可行的 我曾经为 Lua 5 0 2 做过 但找不到文件 在您拥有的选项中 您可以 将 Lua 封装在公开 Lua AP
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • 模拟后 CreateMutex 失败

    这是我尝试模拟用户然后创建互斥体的代码 未创建互斥体 我收到 ERROR ACCESS DENIED 错误 void Impersonate DWORD logonType LOGON32 LOGON INTERACTIVE DWORD l
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • 需要从 DCOM 配置中删除对象 (DCOMCNFG)

    我们有一个带有 activex exe 和 com dll 的应用程序 安装后 我们会在 DCOM 配置中创建一个对象 如果我们尝试从 DCOM 配置中删除该对象 它就会关闭 直到我们再次重新打开它 想知道是否有任何程序可以从 DCOM 及
  • 如何使用 VB6 调用 Windows shell 命令?

    究竟如何使用 VB6 才能像从命令行一样调用任何 Windows shell 命令 例如 一些微不足道的事情 echo foo 操作方法如下 Shell cmd echo foo vbNormalFocus
  • 具有成员 std::mutex (或其他不可复制对象)的类的复制或移动构造函数?

    class A private class B private std mutex mu A parent NULL public B A const parent ptr parent parent ptr B const A B b c

随机推荐

  • 不使用 kubectl cp 将文件复制到 kubernetes pod 中

    我有一个用例 我的 pod 以非 root 用户身份运行 并运行一个 python 应用程序 现在我想将文件从主节点复制到正在运行的 pod 但当我尝试跑步时 kubectl cp app py 103000 pras dev simple
  • 强制 iOS 视图不旋转,同时仍允许子视图旋转

    我有一个带有子视图控制器的视图控制器 tab bar controller nav controller UIPageViewController should rotate A Video Player shouldn t rotate
  • 在 Eclipse 上通过 gradle 设置 Kotlin

    努力让 Kotlin 在 Eclipse 上运行 我已经开始了新的 gradle 项目 按照 kotlin 站点上的规定添加依赖项 构建过程没有错误 我在 src java main 下创建了 main kt 文件 fun main arg
  • 独立于操作系统的剪贴板在 C 中复制/粘贴文本

    我正在开发一个项目 该项目应该在 Windows 和 Linux 上运行 也有非官方的 Mac 端口 模拟真彩色系统控制台 我的问题是 最近出现了对文本字段支持的请求 是的 基于控制台 并且添加将文本复制到剪贴板并从中粘贴的可能性会很酷 有
  • NDK 如何在发布时删除 Log Debug 语句

    我知道使用 proguard 您可以从发行版本中删除 java Log d 调试语句https stackoverflow com a 13327603 1527440 但是有没有办法从 NDK C C 代码中删除日志调试语句 我正在使用定
  • 接口和类实现接口的 PhpDoc - 区别 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 问题很简单 我应该如何区分接口和类实现接口的 phpdoc 它们应该 可以相同 或者接口文档应该尽可能通用 而实现该接口的类应该更具体 我在真实代码中包含了一种方法 phpDoc 我的界面
  • 查询 dbo.sysobjects 的权限

    我有以下查询来检查我的 SQL 数据库中是否有任何用户定义的对象 DECLARE testForEmpty BIT if exists select top 1 null from dbo sysobjects where objectpr
  • 我的 jar 是用什么版本的 javac 构建的?

    我如何知道构建 jar 时使用的是哪个版本的 Java 编译器 我有一个 jar 文件 它可以在三个 JDK 中的任何一个中构建 我们需要确切地知道是哪一个 以便我们可以证明兼容性 编译器版本是否嵌入在类文件或 jar 中的某个位置 A j
  • 如何将对象集合绑定到 Winforms 中的 DataGridView

    如果我有两个对象 即Fruit andColor 及其定义如下 public class Fruit public int FruitId get set public string Name get set public Color Co
  • 哪些 dbus 性能问题会阻止其在嵌入式系统中使用?

    根据我的阅读 由于守护进程的存在 dbus 性能应该比其他消息传递 ipc 机制慢两倍 在so问题的讨论中使用哪种 Linux IPC 技术有人提到性能问题 除了速度慢一倍之外 您是否还发现了性能问题 您是否看到了阻碍我们在嵌入式系统中使用
  • 如何根据意图强制重新启动活动

    My MainActivity有lauchMode singleTask 现在我想从具有特殊意图数据的通知启动活动 在MainActivity onResume我访问给定的意图数据 问题是 当活动已经存在时 我单击通知 活动进入前台 但是该
  • 在 Google Sheets 自定义函数中抛出自定义异常和错误消息?

    In 谷歌表格 与Excel等 如果用户在公式中输入错误的输入 错误代码将打印在有问题的单元格中 并且一个小弹出窗口提供有关错误的更多详细信息 所以如果我输入 SQRT 1 NUM 打印在单元格中 并且弹出窗口解释该值需要等于或大于 0 如
  • 使用 RestKit 进行外键关系映射

    我对 RestKit 完全陌生 并且有些挣扎 JSON teams id 1 name Team A id 2 name Team B users id 1 name cameron teamId 1 id 2 name
  • 如何在jq中添加索引

    我想使用 jq 映射我的输入 a b 输出 name a index 0 name b index 1 我已经到达 0 as i def incr i i 1 name index incr 其输出 name a index 1 name
  • 如何解决错误 LNK2019

    我正在用 C 发送一封简单的电子邮件 我从下面的链接下载了一个示例 C 程序 http cboard cprogramming com cplusplus programming 125655 sending simple email cp
  • 如何以编程方式在另一个 shapeDrawable 内绘制较小的 ShapeDrawable

    我试图在另一个圆圈内画一个较小的圆圈 这看起来很简单 但我遇到了麻烦并且找不到答案 我使用的代码是 ShapeDrawable biggerCircle new ShapeDrawable new OvalShape biggerCircl
  • iPhone:绘制一条曲线直到它变成一个圆形动画

    我希望画一条曲线 直到它旋转一周并连接成一个完整的圆 只是圆的轮廓 没有填充 这必须在几秒钟内进行动画处理 有人能指出我正确的方向吗 我已经问过一个类似的问题但我的措辞不正确 所以每个人都很难理解我的意思 因此它迷失在问题的海洋中 非常感谢
  • 在 spring 中销毁另一个用户的会话

    在我的应用程序中 我有一个可以删除用户的管理员 因此 当我从管理会话中删除用户时 我希望删除的用户应该自动注销 我知道我删除的用户的会话 ID 但我不知道如何使用会话 ID 使会话无效 我想要类似的东西 invalidate Session
  • ASP.Net MVC 中的 PageMethods

    我发现 ASP Net PageMethods 非常方便且易于使用 但我刚刚开始使用 MVC 进行开发 不确定如何使用它们 相当于什么PageMethods MyFunction 在 MVC 中 MyFunction 是控制器操作 我知道我
  • VB6:跨所有用户会话的单实例应用程序

    我有一个应用程序需要成为 Windows PC 上所有用户会话的单实例应用程序 到目前为止 我的研究主要集中在使用互斥锁来完成此任务 但我遇到了一个问题 我不确定这是否真的是一个问题 我相信这确实是一个最佳实践问题 首先是代码 Privat