从服务获取登录用户名

2023-12-08

我有一项必须登录本地管理员才能安装的服务。此服务的目的是在用户登录或注销时记录其用户名。我终于找到了一些我认为可以工作的WMI代码,但它仍然返回管理员。为什么这不起作用?

var query = new ObjectQuery("SELECT * FROM Win32_Process WHERE Name = 'explorer.exe'");
var explorerProcesses = new ManagementObjectSearcher(query).Get();

foreach (ManagementObject mo in explorerProcesses)
{
    string[] ownerInfo = new string[2];
    mo.InvokeMethod("GetOwner", (object[])ownerInfo);

    userName = String.Concat(ownerInfo[1], @"\", ownerInfo[0]);
}
Console.WriteLine(userName);
Console.ReadLine();

为了澄清我的问题,我试图获取当前登录的用户,但它给了我管理员用于安装服务的帐户。


为此,您应该使用服务控制管理器通知。您可以将服务配置为在用户登录和/或注销时接收通知事件。这允许服务在需要时进行交互式用户模拟,但它应该为您提供日志记录所需的信息。

请查看此处的“使用服务控制管理器 (SCM) 通知”部分http://technet.microsoft.com/en-us/library/cc721961(WS.10).aspx

edit

在您的 Service 类中重写 OnSessionChange 事件处理程序以检查登录和注销事件。

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
    base.OnSessionChange(changeDescription);

    switch (changeDescription.Reason)
    {
        case SessionChangeReason.SessionLogon:
            // do your logging here
            break;

        case SessionChangeReason.SessionLogoff:
            // do your logging here
            break;
    }
}

edit2:

class Class1
{
    [DllImport("Advapi32.dll")]
    static extern bool GetUserName(StringBuilder lpBuffer, ref int nSize);    
    [STAThread]
    static void Main(string[] args)
    {
        StringBuilder Buffer = new StringBuilder(64);
        int nSize=64;
        GetUserName(Buffer, ref nSize);
        Console.WriteLine(Buffer.ToString());
    }
}

edit3:

public class InteractiveUser
{
    [DllImport("wtsapi32.dll", SetLastError = true)]
    static extern bool WTSQueryUserToken(UInt32 sessionId, out IntPtr Token);

    [DllImport("kernel32.dll")]
    private static extern UInt32 WTSGetActiveConsoleSessionId();

    enum TOKEN_INFORMATION_CLASS
    {
        TokenUser = 1,
        TokenGroups,
        TokenPrivileges,
        TokenOwner,
        TokenPrimaryGroup,
        TokenDefaultDacl,
        TokenSource,
        TokenType,
        TokenImpersonationLevel,
        TokenStatistics,
        TokenRestrictedSids,
        TokenSessionId,
        TokenGroupsAndPrivileges,
        TokenSessionReference,
        TokenSandBoxInert,
        TokenAuditPolicy,
        TokenOrigin
    }

    public struct TOKEN_USER 
    { 
        public SID_AND_ATTRIBUTES User; 
    } 

    [StructLayout(LayoutKind.Sequential)]
    public struct SID_AND_ATTRIBUTES 
    { 
        public IntPtr Sid; 
        public int Attributes; 
    } 

    // Using IntPtr for pSID insted of Byte[]
    [DllImport("advapi32", CharSet=CharSet.Auto, SetLastError=true)]
    static extern bool ConvertSidToStringSid(
        IntPtr pSID, 
        out IntPtr ptrSid);

    [DllImport("kernel32.dll")]
    static extern IntPtr LocalFree(IntPtr hMem);

    [DllImport("advapi32.dll", SetLastError=true)]
    static extern bool GetTokenInformation(
        IntPtr TokenHandle,
        TOKEN_INFORMATION_CLASS TokenInformationClass,
        IntPtr TokenInformation,
        int TokenInformationLength,
        out int ReturnLength);

    private static string GetSID(IntPtr token)
    {
        bool Result;

        int TokenInfLength = 0; 
        string sidAsString = String.Empty;

        // first call gets lenght of TokenInformation
        Result = GetTokenInformation( token , TOKEN_INFORMATION_CLASS.TokenUser , IntPtr.Zero , TokenInfLength , out TokenInfLength ); 

        IntPtr TokenInformation = Marshal.AllocHGlobal( TokenInfLength ) ; 
        Result = GetTokenInformation( token  , TOKEN_INFORMATION_CLASS.TokenUser , TokenInformation , TokenInfLength , out TokenInfLength ) ; 

        if ( Result ) 
        {
            TOKEN_USER TokenUser = ( TOKEN_USER )Marshal.PtrToStructure( TokenInformation , typeof( TOKEN_USER ) ) ; 

            IntPtr pstr = IntPtr.Zero; 
            Boolean ok = ConvertSidToStringSid( TokenUser.User.Sid  , out pstr ); 

            sidAsString = Marshal.PtrToStringAuto( pstr ); 
            LocalFree(pstr);
        }

        Marshal.FreeHGlobal( TokenInformation );

        return sidAsString;
    }

    public static string Account()
    {
        IntPtr token = IntPtr.Zero;
        String account = String.Empty;

        if (WTSQueryUserToken(WTSGetActiveConsoleSessionId(), out token))
        {
            String sid = GetSID(token);
            account =
                new SecurityIdentifier(sid).Translate(typeof(NTAccount)).ToString();
        }
        else
        {
            int err = Marshal.GetLastWin32Error();
            switch (err)
            {
                case 5:
                    account = "ERROR_ACCESS_DENIED";
                    break;
                case 87:
                    account = "ERROR_INVALID_PARAMETER";
                    break;
                case 1008:
                    account = "ERROR_NO_TOKEN";
                    break;
                case 1314:
                    account = "ERROR_PRIVILEGE_NOT_HELD";
                    break;
                case 7022:
                    account = "ERROR_CTX_WINSTATION_NOT_FOUND";
                    break;
                default:
                    account = String.Format("ERROR_{0}", err.ToString());
                    break;
            }
        }

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

从服务获取登录用户名 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • HashMap 通过考虑它们的值来映射整数数组

    鉴于以下代码 我得到null 我想要的是 1234 但我希望有一个可以将键视为相等的映射 如果int 是相等的 而不是认为int 我该怎么办呢 HashMap
  • Spring - 用新的属性文件值替换 bean 属性值

    我有一个属性文件 并使用 Spring 属性占位符 将值设置为 Spring bean 现在 该属性文件可以在运行时修改 有没有办法用这个新修改的属性值刷新 Spring bean 的属性 特别是 我有很多单例豆 我怎样才能用新值刷新它们
  • 将字符串转换为日期时间 dd/MM/yyyy hh:mm:ss tt

    我怎样才能转换这个7 3 2015 12 40 02 PM转换为具有格式的日期时间 dd MM yyyy hh mm ss tt 我已经这样做了 BreackEndTime DateTime ParseExact configViewMod
  • vim 中按名称对函数进行排序

    Vim 可以使用 sort 命令对行进行排序 我想使用 vim 对源代码中的函数进行排序 例如 前 def a pass def c pass def b pass after def a pass def b pass def c pas
  • 图像-Xamarin.Form

    我已经实现了一个登录页面 现在我想添加一个标题图像 但是 图像不会显示在视图上 public LoginView InitializeComponent Title Login Content new StackLayout Spacing
  • 如何在Asp.net CORE MVC中的浏览器上下载PDF文件

    我使用下面的代码来下载 pdf 格式的 SSRS 报告 string URL http ssrs test com ReportS UAT FOLDER URL URL SRNo 122 rs Command Render rs Forma
  • 在调试模式下启动服务器时,阻止 Eclipse 自动打开调试透视图

    有几个关于堆栈溢出的示例 说明如何在调试器激活 即遇到断点 这可以通过以下方式实现 首选项 gt 运行 调试 gt 透视图 gt 当应用程序挂起时打开关联的透视图 我的问题不是这个 每当我启动我的服务器在调试模式下 将打开调试透视图 由于我
  • std::vector 中如何管理动态内存?

    std vector如何实现对元素数量变化的管理 是使用realloc 函数 还是使用链表 Thanks 它使用作为第二个模板参数提供给它的分配器 那就这样吧 假设它在push back中 让t是要推送的对象 if size capacit
  • angularjs ng-repeat 按数字顺序排序字符串数组

    我有一个 id 类似的帖子列表1 2 3 4 5 6 7 8 9 10 11 12 json格式 id 的类型为字符串 但我想按照它的数字顺序来排序 正常 orderBy fiche id 列表显示如下 1 10 11 12 2 3 4 5
  • 在 Matlab 中使用 dlmcell 换行 - 在 Notepad++ 中显示,但在记事本中不显示

    我正在使用 Matlab 中的 dlmcell 函数来输出文本 每次使用 dlmcell 附加时 我都希望在新行上显示文本 当我在 Notepad 中打开书面文档时 每个文本片段都会按照我的需要换行 然而 用windows自带的记事本打开
  • 使用C库函数设置系统时间

    我可以使用 struct tm 和 time localtime asctime 获取系统时间 但是我需要有关如何使用 C 程序设置系统时间的帮助 如果您不想执行 shell 命令 您可以 正如您提到的 使用 settimeofday 我将
  • 如何创建具有值映射的自定义悬停工具

    我正在尝试创建一个自定义悬停工具 使用该工具获取绘图的 y 值并将该值映射到不同的值 到目前为止我可以想出的实现此功能的代码是 from bokeh models import HoverTool import holoviews as h
  • 将 ZonedDateTime 转换为字符串

    我需要将当前时间作为字符串存储在数据库中 时间可以位于不同的时区 因此我正在考虑使用 Java SE 8 的新 ZonedDateTime 类 我注意到 toString 方法自动输出 2016 04 15T17 40 49 305 05
  • PHP 每隔周三选择一次

    我需要帮助 选择从 2012 年 5 月 2 日开始每隔一个星期三 下面的代码选择从当前所在周开始每隔一个星期三 但我需要设置开始周 我熟悉 PHP 但不熟悉 php 日期 所以请尽可能具体 我找到了这个 number of dates 1
  • 使用 Jackson 注释序列化和解包 POJO 中的 Map 对象

    我有一个 POJO 其属性名为 paramMap 作为 Map 类型 import java util HashMap import java util Map import com fasterxml jackson annotation
  • 时间序列中的每小时平均值

    这是一个具有每小时智能电表数据且 freq 24 的时间序列 它是在三天内测量的 所以first day 1 24 second 25 48 third 49 72 我想要三天内每小时的平均值 例如 t 1 t 25 t 49 3 这样我就
  • 如何仅将 CSV 中的唯一值添加到 ComboBox 中?

    我想读取 csv 文件并将单词 Jakarta 和 Bandung 放入组合框中 这是输入 id from 1 Jakarta 2 Jakarta 5 Jakarta 6 Jakarta 10 Bandung 11 Bandung 12 B
  • ORA-28040: 没有匹配的身份验证协议

    即使按照以下设置 我仍然面临这个问题 更换ojdbc14 jar with ojdbc6 jar 也尝试过ojdbc5 jar Added SQLNET ALLOWED LOGON VERSION SERVER 8 到 sqlnet ora
  • 精灵套件中的裁剪/蒙版圆形图像节点会产生锯齿状边缘

    是否可以为没有锯齿状边缘的图像节点提供圆形蒙版 裁剪 按照苹果公司的这个例子 https developer apple com reference spritekit skcropnode 结果并不理想 您可以点击链接查看 let sha
  • 从服务获取登录用户名

    我有一项必须登录本地管理员才能安装的服务 此服务的目的是在用户登录或注销时记录其用户名 我终于找到了一些我认为可以工作的WMI代码 但它仍然返回管理员 为什么这不起作用 var query new ObjectQuery SELECT FR