将应用程序作为系统运行(不使用PSTools)

时间:2015-12-31 19:09:17

标签: vb.net windows

System有一些注册表项,除非我以System身份运行,否则我无法编辑它们。我希望能够从我的VB应用程序编辑这些键。我发现的任何教程都建议使用PSTools,现在已弃用的At命令或schtasks。 PSTools似乎很棒,但它的许可似乎是限制性的(关于重新分发)。 at和schtasks太乱了,需要调度延迟。

这与我之前的问题有关。我想采取我发现的,并通过VB实现它。

Modify audit policy (group policy)

我也发现了这一点,但是收到错误1314.我意识到尽管运行VS2010" requireAdministrator",甚至以管理员身份运行我的EXE,它仍然在任务管理器中显示我的用户名(以我身份运行,而不是管理员)。我以管理员身份登录,并获得了错误5。即使确保我已经按照这篇文章(CreateProcessAsUser error 1314)的建议设置了权限,它仍然给了我错误5。

Using a vb.net application running as SYSTEM, how do I start a detached process for each logged on user?

我将示例更改为" TokenAccessLevels.Read和Duplicate"而不是MaximumAllowed。

 If Not DuplicateTokenEx(hToken.DangerousGetHandle,
            TokenAccessLevels.Read & TokenAccessLevels.Duplicate,
            Nothing,
            SECURITY_IMPERSONATION_LEVEL.SecurityImpersonation,
            TOKEN_TYPE.TokenPrimary,
            phNewToken) Then

我从CreateProcessAsUser获得错误5。这是以管理员身份运行VS2010。

1 个答案:

答案 0 :(得分:0)

http://forum.sysinternals.com/tip-run-process-in-system-account-scexe_topic16714.html

这篇文章是我能做的最好的。基本上,安装服务,运行它,然后删除它。根据OP,这是他的解释。

  

那它是如何运作的?

     
      
  1. &符号告诉cmd.exe解析后面的文本,好像它是批处理文件中的新行(它基本上是一个新行   分隔符,允许多个命令组合成1行)
  2.         

    要将其分解:创建服务 - sc create - binPath =" cmd / c start   计算值" type = own type = interact Start Service net start - (这可以   也可以用:sc start - )删除服务sc删除 -

         
        
    1. 变量      
          
      • 服务名称: -
      •   
      • 运行的应用程序:calc
      •   
    2.         

      变量:

           
          
      1. 工作原理:
      2.         

        cmd / c - 允许我们将参数传递给cmd(没有这个初始值   部分,如果你复制&粘贴在cmd.exe中,但不在“运行”中   对话。所以这个修复了它)sc create binPath = - 因为cmd.exe没有   当SCM在binPath中运行应用程序时,响应服务命令(Reg   = ImagePath)然后它会终止它,当没有及时响应时,因此无法使用cmd.exe。它必须打电话   在这种情况下是calc.exe sc create type =这一个的其他东西   花了一段时间才弄明白。最初的问题是Window Station   其中启动了cmd.exe(其中继承了   calc.exe(其子进程))。幸运的是,在阅读了Mark的Windows之后   内部e4,我能够通过将服务指定为来解决它   互动。 (试验,它实际上必须是两个   交互式(256)和拥有(16)(256 | 16 = 272)。基本上这是什么   允许窗口在\ WinSta0 \ Default(当前   用户的桌面,允许显示窗口。)一些之后   沮丧的研究表明sc不会接受类型   = own | interact,我发现它允许我们再次指定它,而不是覆盖Type(dword)它按位OR运算(添加它)。   问题解决了! net start - 启动服务(可能是调用   StartService)cmd.exe使用start [File]的命令行(CL)运行   其中的开始可能会调用ShellExecute(很不如MS没有。)   允许开始指定SW_ *命令(如hide)。虽然确实如此   允许我们最小/最大窗口。 cmd.exe打开应用程序/文件,即SCM   终止cmd.exe没有及时响应它   命令,现在向用户显示窗口。 sc delete - 最后   我们通过删除服务来清理我们的路径

对我来说,这很有效。

cmd /c sc create -- binPath= "cmd /c start app.exe" type= own type= interact & net start -- & sc delete --

现在,我无法获得绝对的工作路径。我不得不把我的.EXE放在System32和SysWOW64中,所以我没有必要使用绝对路径。根据该网站,这应该允许绝对路径工作。

cmd /c sc create -- binPath= "cmd /c start  \"\"  \"C:\windows\regedit.exe\" " type= own type= interact & net start -- & sc delete --

它从来没有对我有用,因为它会挂起一段时间而且永远不会启动应用程序。它应该几乎立即完成。