我目前有一个在系统帐户下运行的Windows服务.我的问题是我需要从服务中启动某些进程作为当前登录用户.我有所有代码等来获取当前登录的用户/活动会话.
我的问题是我需要生成一个进程作为登录用户但不知道用户凭据等.
该服务是.net编译服务,我希望我需要使用一些Pinvoke方法来获取当前用户进程之一的句柄,以便将其复制并作为句柄处理午餐.
不幸的是,我找不到任何关于如何实施它的好文档/解决方案?
如果有人能够给我一些指导/示例,我将非常感激.
*更新* 我想我已经解释不正确,需要根据我的实际需要重新调整.我不一定想要启动一个新进程,我只是想模仿已登录的用户.我已经非常专注于查看CreateProcess等我已经引导自己沿着创建新进程的路径作为当前登录用户(这不是我想要做的事情).
反过来,我只想在当前用户上下文下运行一些代码(模拟当前登录用户)?
大家早,
这个问题似乎已经被问过几次了,但是我找不到它是否真正可行。我已经张贴在这里
没有回复-让我们尝试在这里问别人。
我的目标是在当前用户上下文中(仅当它们在本地管理员组中)从服务启动提升的进程(作为管理员)。
我可以毫无问题地获得“当前用户”令牌,但无法获得该帐户的辅助/管理员令牌!
我已经阅读了很多论坛,但无法使其正常工作(开始认为这样做不可行)。
我目前的方法:
WTSGetActiveConsoleSessionId -获取活动会话IDWTSQueryUserToken -获取会话ID的用户令牌OpenProcess -登录用户的explorer.exe的进程句柄OpenProcessToken -获取访问令牌的句柄LookupPrivilegeValue -SE_DEBUG,以确认我们可以调整令牌权利DuplicateTokenEx -用户令牌SetTokenInformationAdjustTokenPrivilegesCreateEnvironmentBlock -在中运行新流程CreateProcessAsUser -希望在提升的用户上下文中生成该过程(不发生-标准用户上下文)请查看下面的代码-抱歉,它很杂乱,需要整理并且所有句柄都已关闭。目前,这只是实验性代码。
public static bool CreateProcessInConsoleSession(String CommandLine, bool bElevate)
{
PROCESS_INFORMATION pi;
bool isadmin = IsUserAnAdmin();
bool bResult = false;
uint dwSessionId, winlogonPid = 0;
IntPtr hUserToken = IntPtr.Zero, hUserTokenDup = IntPtr.Zero,
hPToken = IntPtr.Zero, hProcess = IntPtr.Zero;
Debug.Print("CreateProcessInConsoleSession");
// Log the client on to the local computer.
dwSessionId = WTSGetActiveConsoleSessionId();
// Find the …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Dropbox API 获取业务 Dropbox 团队成员的目录列表。
该文档似乎有些不清楚,并且令人沮丧地难以获取内容。因此我的代码可能会有所偏差,这也是我遇到问题的原因。我有一个用于团队和我的管理员用户的开发令牌。
using (var client = new DropboxTeamClient("my token"))
{
var teamInfo = await client.Team.GetInfoAsync();
var teamName = teamInfo.Name;
var numberOfUsers = teamInfo.NumProvisionedUsers;
var memListResult = await client.Team.MembersListAsync();
foreach (var m in memListResult.Members)
{
var accountId = m.Profile.AccountId;
var email = m.Profile.Email;
Console.WriteLine($"Id {accountId} - email is {email}");
}
var accId = memListResult.Members.First(x => x.Profile.Email.Equals("myEmail"))
?.Profile.AccountId;
var memId = memListResult.Members.First(x => x.Profile.Email.Equals("myEmail"))
?.Profile.TeamMemberId;
var dbx = client.AsAdmin(memId);
try
{
var full = await dbx.Users.GetCurrentAccountAsync();
Console.WriteLine("{0} …Run Code Online (Sandbox Code Playgroud)