- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的代码。我在 Release模式下编译并运行它。它打印输出。我在链接器中添加了库作为 wtsapi32.lib。
#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <iostream>
#include <tchar.h>
#include <wtsapi32.h>
#include <atlstr.h>
#include <string>
#define INFO_BUFFER_SIZE 32767
int _tmain(int argc, _TCHAR* argv[])
{
//bool pidToSessionId = ProcessIdToSessionId(GetCurrentProcessId(),_Out_ DWORD *pSessionId);
DWORD*pSessionId = (DWORD*)malloc(sizeof(DWORD));
bool pidToSessionId = ProcessIdToSessionId(GetCurrentProcessId(),pSessionId);
std::cout << *pSessionId << std::endl;
LPWSTR*infoBuf = (LPWSTR*)malloc(sizeof(LPWSTR));
DWORD bufCharCount = INFO_BUFFER_SIZE;
WTSQuerySessionInformation(NULL, *pSessionId,/**_WTS_INFO_CLASS.*/WTSUserName, infoBuf, &bufCharCount);
std::wcout << *infoBuf << std::endl;
std::string st = CW2A(*infoBuf);
std::cout << st << std::endl;
_getch();
return 0;
}
我需要将其作为服务运行。然后我用 nssm https://nssm.cc/ 安装它并设置一个文件来打印输出。 nssm 允许您打印文件中的输出。但它只打印 pSessionId。我的代码有什么问题?谁能说说原因?
最佳答案
首先,您使用 malloc()
分配指针变量既浪费又不必要,更不用说您正在泄漏正在分配的内存。只需在堆栈上声明指针即可,这样更容易也更安全。
其次,在 Vista 及更高版本中,所有服务都在 Session 0 中运行,用户登录到 Session 1 及更高版本。这被称为 Session 0 Isolation :
Services have always run in session 0. Before Windows Vista, the first user to log on was also assigned to session 0. Now, session 0 is reserved exclusively for services and other applications not associated with an interactive user session. (The first user to log on is connected to session 1, the second user to log on is connected to session 2, and so on.) Session 0 does not support processes that interact with the user.
This change means that a service cannot post or send a message to an application and an application cannot send or post a message to a service. In addition, services cannot display a user interface item such as a dialog box directly. A service can use the WTSSendMessage function to display a dialog box in another session.
Impact of Session 0 Isolation on Services and Drivers in Windows
Session 0 isolation: Where backward compatibility loses to security
要从服务内部查找登录用户,您必须使用 WTSEnumerateSessions()
枚举可用 session ,在每个上调用 WTSQuerySessionInformation()
(您也可以在 Win2000 和 XP 中执行此操作,它们允许用户登录到 Session 0)。并且不要忘记释放 WTS 函数返回给您的所有内存缓冲区。
第三,您根本没有进行任何错误处理。
尝试更像这样的东西:
int _tmain(int argc, _TCHAR* argv[])
{
PWTS_SESSION_INFO pSessions = NULL;
DWORD dwCount = 0;
DWORD dwError;
if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessions, &dwCount))
{
dwError = GetLastError();
std::cout << "Error enumerating sessions: " << dwError << std::endl;
}
else if (dwCount == 0)
{
std::cout << "No sessions available" << std::endl;
}
else
{
DWORD dwNumActive = 0;
for (DWORD i = 0; i < dwCount; ++i)
{
if (pSessions[i].State == WTSActive) // has a logged in user
{
++dwNumActive;
std::cout << "Session: " << pSessions[i].SessionId << ", ";
LPWSTR pUserName = NULL;
DWORD dwBufSize = 0;
if (!WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, pSessions[i].SessionId, WTSUserName, &pUserName, &dwBufSize))
{
dwError = GetLastError();
std::cout << "Error getting username: " << dwError;
}
else
{
//std::wcout << pUserName << std::endl;
std::string st = CW2A(pUserName);
std::cout << "User: " << st;
WTSFreeMemory(pUserName);
}
std::cout << std::endl;
}
}
if (!dwNumActive)
std::cout << "No users are logged in" << std::endl;
}
WTSFreeMemory(pSessions);
_getch();
return 0;
}
话虽如此,在非服务进程中,如果您需要与运行您的应用程序的 session 关联的登录用户名,并且您没有将代码作为与登录用户不同的用户(UAC 提升、模拟等),那么您可以只使用 GetUserName()
相反:
int _tmain(int argc, _TCHAR* argv[])
{
WCHAR szUserName[UNLEN+1];
DWORD dwCount = UNLEN+1;
if (!GetUserNameW(szUserName, &dwCount))
{
DWORD dwError = GetLastError();
std::cout << "Error getting username: " << dwError << std::endl;
}
else
{
//std::wcout << szUserName << std::endl;
std::string st = CW2A(szUserName);
std::cout << "User: " << st << std::endl;
}
_getch();
return 0;
}
否则,您将再次返回到 WTSQuerySessionInformation()
:
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwSessionId;
DWORD dwError;
if (!ProcessIdToSessionId(GetCurrentProcessId(), &dwSessionId))
{
dwError = GetLastError();
std::cout << "Error getting Session ID: " << dwError << std::endl;
}
else
{
std::cout << "Session: " << dwSessionId << ", ";
LPWSTR pUserName = NULL;
DWORD dwBufSize = 0;
if (!WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, dwSessionId, WTSUserName, &pUserName, &dwBufSize))
{
dwError = GetLastError();
std::cout << "Error getting username: " << dwError;
}
else
{
//std::wcout << pUserName << std::endl;
std::string st = CW2A(pUserName);
std::cout << "User: " << st;
WTSFreeMemory(pUserName);
}
std::cout << std::endl;
}
_getch();
return 0;
}
关于c++ - 作为服务运行时,获取 C++ 中的当前登录用户名不显示任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35029332/
我想做的是从 table1 中获取 usernames 和 picURLs WHERE usernames = all the usernames from this query (从表 2 中选择用
我使用字符串“username”作为表的主键, 但是,当保存并获取具有用户名ID的列时,我希望忽略这种情况,以使新用户无法尝试模拟其他用户。 ,例如注册新用户时 用户名=达克森 用户名= DaXoN
在 ReportManager 中,我有很多用户提示这个错误。当我筛选 RS 日志时,我多次看到不同用户的以下错误: session!ReportServer_0-2!1e40!04/20/2011-
我是 Node js新手,我正在尝试将MySql与 Node 连接的示例。当我运行代码时,我得到 Error while performing Query.Error: ER_ACCESS_DENIE
收集整理了15个常用的javaScript正则表达式,其中包括用户名、密码强度、整数、数字、电子邮件地址(Email)、手机号码、身份证号、URL地址、 IPv4地址、 十六进制颜色、 日期、 QQ
我正在做一个需要以下内容的项目。 服务器端的 WCF 服务 (.NET 3.5) 客户端的 WPF 客户端 (.NET 3.0) 我有一个现有的应用程序,我必须使用(在服务器端)的身份验证和授权。我还
用户名,密码和电子邮件的标准最小和最大长度是多少? 最佳答案 我对此问题有疑问,因为它预先假设应该有一个标准,并且所有服务的值都应该相同。 我认为为这些字段中的任何一个(例如密码字段)加上最大长度是没
我看到in the standard我可以拥有 autocomplete要么等于 username或 email在输入字段上。 就我而言,用户名实际上是用户的电子邮件。 什么是最好的autocompl
我正在尝试编写一些网站代码并创建用户名和密码。我不知道这是否完全合乎逻辑,或者即使代码已修复,它是否仍能工作,但我是一个初学者,我正在从零开始工作。这是我所拥有的: alert("Welcome.
我想使用ncat编写一个简单的bash脚本,以打开与ISP及其端口的连接。 第一个命令是: nc address port 完成此操作后,首先提示我提供一个用户名。我必须按ENTER键,然后提示我提供
我收到此错误是因为我创建了一个自定义用户模型,并且在完成所有设置后(将其设置为django / contrib / auth / models.py),我将电子邮件设置为USERNAME_FIELD,
我有 3 台 Windows 7 Professional 机器。两台被设置为安装了 Git 的开发机器(一台台式机和一台笔记本电脑)。第三个是设置为安装了 Git 的文件服务器,并且它还作为 ssh
def login(): UserName = input("Please enter your username: ") passw = input("Please enter yo
我正在 Kivy 中创建一个应用程序。我正在创建一个登录页面,允许用户输入密码和用户名,以验证他们以前是否使用过我的应用程序。我将用户名和密码存储在名为“users”的 MySQL 数据库中,该表称为
什么是 Mysql 查询 REGEXP 来调用它? @text @user_name @4ll_r1ght @last2 @_last1 @and1more_ 最佳答案 SELECT * FROM u
我在寻找用户名和电子邮件垃圾邮件列表。当用户尝试注册时,我想检查他们输入的用户名或电子邮件是否在用户名/电子邮件垃圾邮件列表中,如果是,则将帐户标记为可疑垃圾邮件并手动验证成员资格。 它背后的后端不是
你好, 我被一个小问题困住了, 我需要允许 muplite 用户能够登录 我的 php 代码与一个成员一起工作,我怎样才能让多个用户可以登录, 如果有更好的使用 MySql 的方法请告诉我 $
是否有一组在编译时创建的定义,我可以使用它们来填充 printk 语句,其中包含有关在哪里以及谁最后构建内核驱动程序的信息?我知道有预定义的 C 宏,我希望在那里找到一些在编译开始时动态设置的东西,但
我正在为我正在开发的网站创建登录脚本。目前,我已将用户名和密码硬编码到脚本中。即 $usersAndPasses = array( 'username1' => 'password1',
我想像这样从成员列表页面收集用户名: http://www.marksdailyapple.com/forum/memberslist/ 我想从所有页面中获取每个用户名, 我想在 linux 中用 b
我是一名优秀的程序员,十分优秀!