标签: createprocessasuser

从非交互式服务启动UAC升级进程(win32/.net/powershell)

我正在使用第三方Windows服务,通过使用CreateProcessAsUser()运行脚本和可执行文件来处理一些自动化任务.由于UAC,我在Windows Server 2008上遇到了问题,并且通过API处理LUA提升的方式.

该服务作为LocalSystem运行,并且未启用"Interact With Desktop".这些进程作为Administrators组中的用户运行,但不是管理员帐户(免除许多UAC限制).所有UAC默认设置都已到位.

我可以将任意命令或powershell代码传递给服务,但我似乎无法"突破"由服务启动的非提升的非交互式进程.

问题的症结似乎是启动提升过程的唯一(公共)API选项是具有'runas'动词的ShellExecute(),但据我所知,无法从非交互式调用服务或您收到"此操作需要交互式窗口站"之类的错误.

我发现的唯一解决方法在这里提到:http: //www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx

在Vista中,官方记录的提升进程的方法仅使用shell API ShellExecute(Ex)(不是CreateProcess或CreateProcessAsUser).因此,您的应用程序必须调用ShellExecute(Ex)来启动升级的帮助程序以调用SendInput.此外,由于Session 0隔离,服务只能使用CreateProcessAsUser或CreateProcessWithLogonW(不能使用ShellExecute(Ex))来指定交互式桌面.

..我认为没有直接的方法从Windows服务产生提升的进程.我们只能首先使用CreateProcessAsUser或CreateProcessWithLogonW将非提升的进程生成到用户会话(交互式桌面)中.然后在非提升的进程中,它可以使用ShellExecute(Ex)为真实任务生成提升的进程.

要从.net/powershell代码执行此操作,看起来我必须做一些精心设计的P/Invoke来调用CreateProcessAsUser或CreateProcessWithLogonW,因为.Net System.Diagnostics.ProcessStartInfo没有相应的lpDesktop,我可以设置为"winsta0\default".而且我不清楚LocalSystem是否有权调用CreateProcessAsUser或CreateProcessWithLogonW.

我还查看了 http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessas-in-net.aspxProcess.Start与UAC的不同凭据

基于这一切,我得出结论,没有直接的方法来做到这一点.我错过了什么吗?这看起来真的不应该那么难.感觉UAC从未被设计用于处理非交互式用例.

如果有任何微软人员最终阅读此内容,我注意到ShellExecute内部处理提升的方式是通过调用应用程序信息服务(AIS).为什么通过某些Win32或.NET API不能同样调用AIS? http://msdn.microsoft.com/en-us/library/bb756945.aspx

抱歉,跑了一会儿.谢谢你的任何想法.

winapi uac shellexecute createprocessasuser

16
推荐指数
1
解决办法
2万
查看次数

从C#调用CreateProcessAsUser

我一直在尝试使用CreateProcessAsUserWindows API 的功能在特定用户的上下文中创建一个新进程,但似乎遇到了一个相当讨厌的安全问题......

在我进一步解释之前,这里是我正在使用的代码来启动新进程(一个控制台进程 - PowerShell具体,尽管它无关紧要).

    private void StartProcess()
    {
        bool retValue;

        // Create startup info for new console process.
        var startupInfo = new STARTUPINFO();
        startupInfo.cb = Marshal.SizeOf(startupInfo);
        startupInfo.dwFlags = StartFlags.STARTF_USESHOWWINDOW;
        startupInfo.wShowWindow = _consoleVisible ? WindowShowStyle.Show : WindowShowStyle.Hide;
        startupInfo.lpTitle = this.ConsoleTitle ?? "Console";

        var procAttrs = new SECURITY_ATTRIBUTES();
        var threadAttrs = new SECURITY_ATTRIBUTES();
        procAttrs.nLength = Marshal.SizeOf(procAttrs);
        threadAttrs.nLength = Marshal.SizeOf(threadAttrs);

        // Log on user temporarily in order to start console process in its security context.
        var hUserToken = IntPtr.Zero; …
Run Code Online (Sandbox Code Playgroud)

c# privileges winapi process createprocessasuser

9
推荐指数
3
解决办法
3万
查看次数

CreateProcessAsUser错误1314

我想在另一个用户下创建一个进程.所以我使用LogonUser和CreateProcessAsUser.但我的问题是,CreatePtocessAsUser总是返回错误代码1314,这意味着"客户端不持有所需的权限".所以我的问题是,我做错了什么?或者我怎样才能让权利人得到帮助呢?(我认为句柄应该有特权,或者我错了?)抱歉我的英语错误,但我的英语知识不是最好的:)

如果有人知道如何纠正我的申请,Plesase帮助.

这是我代码的一部分.

STARTUPINFO StartInfo;
PROCESS_INFORMATION ProcInfo;
TOKEN_PRIVILEGES tp;
memset(&ProcInfo, 0, sizeof(ProcInfo));
memset(&StartInfo, 0 , sizeof(StartInfo)); 
StartInfo.cb = sizeof(StartInfo); 
HANDLE handle = NULL;

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ALL_ACCESS, &handle)) printf("\nOpenProcessError");

if (!LookupPrivilegeValue(NULL,SE_TCB_NAME,
//SE_TCB_NAME,
&tp.Privileges[0].Luid)) {
printf("\nLookupPriv error");
}

tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes =
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(handle, FALSE, &tp, 0, NULL, 0)) {
printf("\nAdjustToken error");
}

i = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &handle);
printf("\nLogonUser return  : %d",i);
i = GetLastError();
printf("\nLogonUser getlast : %d",i);
if (! ImpersonateLoggedOnUser(handle) ) printf("\nImpLoggedOnUser!");

i = CreateProcessAsUser(handle, …
Run Code Online (Sandbox Code Playgroud)

createprocessasuser

9
推荐指数
2
解决办法
3万
查看次数

Windows 2008 RenderFarm服务:CreateProcessAsUser"会话0隔离"和OpenGL

我有一个传统的Windows服务器服务和(衍生)应用程序在XP-64和W2K3中工作正常,但在W2K8上失败.我相信这是因为新的" Session 0隔离 "功能.

因此,我正在寻找代码示例/安全设置mojo,它允许您从Windows 2008 Server的Windows服务创建一个新进程,以便我可以恢复(并可能超过)以前的行为.我需要一个解决方案:

  1. 在非零会话中创建新进程以绕过会话0隔离限制(无法从会话0访问图形硬件) - 官方MS线路是:

由于会话0不再是用户会话,因此在会话0中运行的服务无法访问视频驱动程序.这意味着服务渲染图形的任何尝试都会失败.查询会话0中的显示分辨率和颜色深度报告系统的正确结果,最高为1920x1200,每像素32位.

  1. 新进程获得一个可用于创建Windows DC的Windows工作站/桌面(例如winsta0/default).我在这里找到了一个解决方案(在交互式会话中启动OK):在C++中启动交互式客户端进程

  2. 当用作OpenGL DescribePixelFormat枚举的基础时,Windows DC 能够找到并使用硬件加速格式(在适当配备OpenGL硬件的系统上).请注意,我们当前的解决方案在XP-64和W2K3上运行正常,除非终端服务会话正在运行(VNC工作正常.)一个允许进程工作的解决方案(即使在终端服务会话打开时使用OpenGL硬件加速运行)也会很奇妙,尽管不是必需的.

我目前只停留在第1项,虽然有一些类似的帖子讨论这个(像这样,这个 - 它们不是合适的解决方案,因为无法保证用户会话已经登录"拿"了来自的会话ID,我也没有从LocalSystem帐户运行(我从服务的域帐户运行,我可以在合理范围内调整权限,尽管我更愿意不必将优先级升级到包括SeTcbPrivileges.)

例如 - 这是我认为应该工作的存根,但总是在SetTokenInformation调用上返回错误1314(即使AdjustTokenPrivileges没有返回任何错误)我也使用了一些涉及"LogonUser"的替代策略(而不是打开现有的进程令牌),但我似乎无法换出会话ID.

我也怀疑在所有情况下都使用WTSActiveConsoleSessionId(例如,如果没有交互式用户登录) - 尽管在没有登录会话的情况下运行的服务的快速测试似乎返回了合理的会话值(1).

我已经删除了错误处理以便于阅读(仍然有点凌乱 - 道歉)

    //Also tried using LogonUser(..) here
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY
                         | TOKEN_ADJUST_PRIVILEGES | TOKEN_ADJUST_SESSIONID
                         | TOKEN_ADJUST_DEFAULT | TOKEN_ASSIGN_PRIMARY
                         | TOKEN_DUPLICATE, &hToken)

GetTokenInformation( hToken, TokenSessionId, &logonSessionId, sizeof(DWORD), &dwTokenLength )

DWORD consoleSessionId = WTSGetActiveConsoleSessionId();

/* Can't use this - requires very elevated privileges (LOCAL only, SeTcbPrivileges as well)   
   if( !WTSQueryUserToken(consoleSessionId, …
Run Code Online (Sandbox Code Playgroud)

opengl windows-services createprocessasuser session-0-isolation windows-server-2008

8
推荐指数
1
解决办法
1万
查看次数

从C#中的CreateProcessAsUser捕获标准输出

我目前正在使用pinvoke CreateProcessAsUser api在asp.net网站内启动进程.这非常适合模拟已登录的AD用户.

然而,不知何故,控制台输出的结果字符串始终为空.我找不到出了什么问题.没有崩溃或任何东西只是没有输出.

public static class Process
{
    static readonly IntPtr INVALID_HANDLE_VALUE = (IntPtr)(-1);
    static readonly HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);

    const int STD_INPUT_HANDLE = -10;
    public const UInt32 Infinite = 0xffffffff;
    const int STARTF_USESTDHANDLES = 0x100;

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool SetHandleInformation(IntPtr hObject, HANDLE_FLAGS dwMask, HANDLE_FLAGS dwFlags);

    [DllImport("kernel32.dll", EntryPoint = "CloseHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    public static extern bool CloseHandle(IntPtr handle);

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern UInt32 WaitForSingleObject(IntPtr …
Run Code Online (Sandbox Code Playgroud)

c# asp.net process createprocessasuser

8
推荐指数
1
解决办法
1829
查看次数

为什么CreateProcessWithTokenW失败并出现ERROR_ACCESS_DENIED

我有一个CreateDrocessWithTokenW调用失败,访问被拒绝.任何想法如何调试这个?

对CreateProcessWithTokenW的调用如下:https://github.com/fschwiet/PShochu/blob/master/PShochu/Pinvoke/NetWrappers/ProcessUtil.cs

现在我正在为当前进程使用访问令牌,最终我将使用来自其他用户的令牌.现在,我正在使用https://github.com/fschwiet/PShochu/blob/master/PShochu/PInvoke/NetWrappers/AccessToken.cs来获取访问令牌.

如果要调试,请下拉源代码并运行build_and_test.ps1.错误堆栈是:

1) Test Error : PShochu.Tests.can_run_remote_interactive_tasks, given a psake script which writes the current process id to output, when that script is invoked interactively, then the script succeeds
   System.ComponentModel.Win32Exception : Access is denied
   at PShochu.PInvoke.NetWrappers.ProcessUtil.CreateProcessWithToken(IntPtr userPrincipalToken, String applicationName,
String applicationCommand, Boolean dontCreateWindow, Boolean createWithProfile, StreamReader& consoleOutput, StreamReader& errorOutput) in c:\src\PShochu\PShochu\PInvoke\NetWrappers\ProcessUtil.cs:line 52
   at PShochu.ProcessHandling.RunNoninteractiveConsoleProcessForStreams2(String command, String commandArguments, String& newLine) in c:\src\PShochu\PShochu\ProcessHandling.cs:line 36
   at PShochu.ProcessHandling.RunNoninteractiveConsoleProcess(String command, String commandArguments) in c:\src\PShochu\PShochu\ProcessHandling.cs:line 20
   at PShochu.Tests.can_run_remote_interactive_tasks.<>c__DisplayClass16.<>c__DisplayClass18.<Specify>b__2() in …
Run Code Online (Sandbox Code Playgroud)

pinvoke winapi createprocessasuser

6
推荐指数
1
解决办法
6034
查看次数

示例代码:服务调用CreateProcessAsUser()我希望进程在用户的会话中运行,而不是会话0

我正在寻找示例代码:

对于服务调用CreateProcessAsUser()我希望进程在用户的会话中运行,而不是在会话0中运行

到目前为止,创建的进程只在会话0中像服务一样运行

windows winapi windows-services createprocessasuser windows-7

6
推荐指数
1
解决办法
2万
查看次数

重定向CreateProcessAsUser的输出

我最近实现了CreateProcessAsUser.我一直试图将输出结果重定向或管道传输到文件.优先流.我试过这个没有运气

更新

要求是:

  • Windows服务应用程序
  • 以系统帐户登录
  • CreateProcessAsUser作为提升用户模拟

码:

public class CreateProcess
{

    #region Constants

    const UInt32 INFINITE = 0xFFFFFFFF;
    const UInt32 WAIT_FAILED = 0xFFFFFFFF;

    #endregion


    #region ENUMS

    [Flags]
    public enum LogonType
    {
        LOGON32_LOGON_INTERACTIVE = 2,
        LOGON32_LOGON_NETWORK = 3,
        LOGON32_LOGON_BATCH = 4,
        LOGON32_LOGON_SERVICE = 5,
        LOGON32_LOGON_UNLOCK = 7,
        LOGON32_LOGON_NETWORK_CLEARTEXT = 8,
        LOGON32_LOGON_NEW_CREDENTIALS = 9
    }


    [Flags]
    public enum LogonProvider
    {
        LOGON32_PROVIDER_DEFAULT = 0,
        LOGON32_PROVIDER_WINNT35,
        LOGON32_PROVIDER_WINNT40,
        LOGON32_PROVIDER_WINNT50
    }

    #endregion


    #region Structs

    [StructLayout(LayoutKind.Sequential)]
    public struct STARTUPINFO
    {
        public Int32 cb; …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke createprocessasuser

6
推荐指数
0
解决办法
1013
查看次数

LogonUser - >来自系统服务的CreateProcessAsUser

我已经阅读了有关CreateProcessAsUser的Stack Overflow上的所有帖子,并且解决的问题很少,所以我不会屏住呼吸.但似乎我肯定错过了一些东西,所以它可能很容易.

目标操作系统是Windows XP.我有一个运行为"本地系统"的服务,我想从中创建一个以不同用户身份运行的进程.对于该用户,我有用户名和密码,因此LogonUser正常,我获得了用户的令牌(在这种情况下,是管理员帐户.)然后我尝试使用该令牌调用CreateProcessAsUser,但它失败,因为该令牌没有SeAssignPrimaryTokenPrivilege - 但是,它确实有SeIncreaseQuotaPrivilege.(我使用GetTokenInformation转储与该令牌关联的所有权限.)根据CreateProcessAsUser的MSDN页面,您需要两个权限才能成功调用CreateProcessAsUser.

它还说你不需要SeAssignPrimaryTokenPrivilege,如果传入CreateProcessAsUser()的令牌是"调用进程'主要令牌的受限版本",我可以用CreateRestrictedToken()创建它,但是它会与之关联本地系统用户而不是我正在尝试运行该进程的目标用户.

那么我如何创建一个登录令牌,它既是调用进程的主要令牌的受限版本,又与另一个用户相关联?谢谢!

请注意,这里不需要用户交互 - 它都是无人值守的 - 所以不需要像抓取WINSTA0等那样做.

windows winapi windows-services createprocessasuser

5
推荐指数
1
解决办法
4884
查看次数

如何在System Windows用户帐户下运行Console App?

我试过了

var process = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = filename,
        UserName = "System",
        UseShellExecute = false,
    },
};

process.Start();
Run Code Online (Sandbox Code Playgroud)

但它产生了

Win32Exception未处理

登录失败:未知用户名或密码错误

我要用CreateProcessAsUser吗?如何获取传递给该方法的相应参数?

.net c# process createprocessasuser

5
推荐指数
1
解决办法
8473
查看次数