C# 以用户身份运行程序,但具有提升的权限

C# 以用户身份运行程序,但具有提升的权限,c#,.net,console-application,administrator,C#,.net,Console Application,Administrator,情景: 管理员将安装该应用程序。应用程序有一些内核级操作,因此必须以特权模式运行。但用户没有管理员凭据,无法在提升模式下运行应用程序 那么,解决上述情况的最佳可能性是什么呢 解决方案一(已尝试): 在通过administrator安装应用程序时,我们将创建一个知道其用户名和密码的管理员。因此,当用户尝试执行任何操作时,我们将使用c#中的函数processstartinfo()和process.start()以提升模式运行应用程序。但是,应用程序以管理员名称运行,因此用户的映射驱动器不可见,因为此

情景:

管理员将安装该应用程序。应用程序有一些内核级操作,因此必须以特权模式运行。但用户没有管理员凭据,无法在提升模式下运行应用程序

那么,解决上述情况的最佳可能性是什么呢

解决方案一(已尝试):
在通过administrator安装应用程序时,我们将创建一个知道其用户名和密码的管理员。因此,当用户尝试执行任何操作时,我们将使用c#中的函数processstartinfo()和process.start()以提升模式运行应用程序。但是,应用程序以管理员名称运行,因此用户的映射驱动器不可见,因为此管理员不在ACL列表中。因此,这种方法被排除在外

有没有一种解决方案,可以将用户提升为管理员,直到使用c#应用程序完成操作

我被卡住了,我找不到任何关于这方面的文章

编辑: 在企业级,windows不要求使用bitlocker的管理员凭据。因此,我们希望实现相同类型的功能

可能吗

有人能帮忙吗


谢谢。

我所做的解决方案是将程序分为两部分。一部分作为使用管理员权限运行的服务运行,另一部分使用普通权限运行。
这两个程序之间的通信可以通过以太网或使用共享内存运行。

我认为您可能会被卡住,因为您正在处理两个具有权限功能的函数,而这两个函数都是正确运行应用程序所必需的

我注意到你们有两个:

  • 文件系统路径。只有登录的用户才能访问此路径(管理员帐户没有)
  • 应用程序进程。只有管理员帐户可以运行这些进程(登录的用户将被提示用户提升)
为了说明这一点

        |  File System Path   |  Application Process
User    |        OK           |          --
Admin   |        --           |          OK
解决方案需要如下所示

        |  File System Path   |  Application Process
Service |        OK           |          OK

如果可能的话,我会说这是最直接的方法,通过这种方法,您可以创建一个具有这两种权限的服务帐户。

您可以尝试创建一个具有管理员权限的并行线程,以便执行内核操作。这样,整个程序就包含在一个可执行文件中

你能做的就是使用。对于.NET,最简单的方法是使用它,它具有各种包装器和实用程序类,可以与COM+组件服务进行互操作

因此,以下是实现这一目标的步骤:

1) 创建.NET Framework类库

2) 添加一个强名称并签名

3) 例如,将其添加到一个类似这样的类中(我还提供了一些实用方法来诊断问题)

4) 将以下内容添加到
AssemblyInfo.cs

[assembly: ApplicationName("AdminApp")]
[assembly: SecurityRole("AdminAppUser")]
[assembly: ApplicationActivation(ActivationOption.Server)]
这样做的目的是定义一个名为“AdminApp”的COM+应用程序,向其中添加一个名为“AdminAppUser”的角色,并声明该应用程序将作为“服务器”运行,这意味着“进程外”

5) 编译并以管理员身份运行此命令

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regsvcs.exe AdminApp.dll
或此命令:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe AdminApp.dll
这两个命令都将创建COM+应用程序的DLL,并将.NET库DLL托管在代理.exe(dllhost.exe)中。如果选择第一个,托管进程将作为x64运行,如果运行第二个,托管进程将作为x86运行

如果运行组件服务(从Windows/运行),则可以检查此注册的结果:

6) 右键点击应用程序,你会看到一大堆你可以配置的很酷的东西。注意,您甚至可以将其作为服务运行(在“激活”选项卡中),等等。您必须做的是配置将运行此过程的标识,类似于:

在这里,我使用了一个自定义管理员帐户。您不想使用任何其他内置选项

7) 现在,由于启用了默认安全性,基本上没有人可以调用这个组件。因此,我们只需向前面创建的角色“AdminAppUser”添加一个用户。当然,您可以使用如下所示的UI执行此操作:

但这里有一段代码可以通过编程实现这一点(我们使用):

现在,当您以“simon”的形式运行它时,您应该会看到如下内容,它可以工作:

Is64BitProcess False
Running As SMO01\simon
Admin App Process Path: C:\WINDOWS\system32\dllhost.exe
Admin App Running As: SMO01\myAdmin
Admin App Is64BitProcess: True
Admin App DoSomethingAsAdmin: 71
例如,当您以未在角色中配置的“bob”身份运行它时,您应该会看到这样的情况,访问被拒绝,这是预期的:

Is64BitProcess False
Running As SMO01\bob

Unhandled Exception: System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {0DC1F11A-A187-3B6D-9888-17E635DB0974} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at UserApp.Program.Main(String[] args) in C:\Users\simon\source\repos\TrustedSystem\UserApp\Program.cs:line 14

注意,我们创建了一个受信任的系统,没有在任何地方设置任何密码。而且,我只触及了COM+组件的表面功能。例如,您可以将应用程序导出为.MSI以便于部署,等等。

“我们知道他的用户名和密码的地方”-任何黑客也很容易知道。更安全的解决方案是安装服务,让主应用程序在那里发出请求。这并不能解决“驱动器映射”问题,难道你不能使用unc名称吗?当你只想对用户本身进行轻度保护时,请查看模拟API。我认为这会使基本用户的环境保持不变。@HenkHolterman是的,留下用户名和密码会很容易受到攻击。实际上,产品必须根据企业的要求进行调整。所以,他们说他们有ACL列表,所以如果应用程序不是以用户身份运行,它就无法访问相关的映射驱动器。模拟与createprocesswithlogonw函数相同,但应用程序在模拟时以用户名或管理员名运行,并且在操作需要时是否具有提升的权限?因此,我可以将App1创建为windows服务项目吗?App2是一个普通的c#应用程序。是的,我也知道这是唯一的方法,你能给我更多关于命名管道和COM输出进程/服务的资源吗?但是应用程序不能调用自定义函数@Susallanikhilesh为什么不呢?你的意思是创建一个windows服务,添加自定义功能,如添加、减去,并在一个时间点安装该服务
using System;
using System.Security.Principal;

namespace UserApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Is64BitProcess " + Environment.Is64BitProcess);
            Console.WriteLine("Running As " + WindowsIdentity.GetCurrent().Name);

            var type = Type.GetTypeFromProgID("AdminApp.AdminClass");
            dynamic trustedClass = Activator.CreateInstance(type);

            Console.WriteLine("Admin App Process Path: " + trustedClass.CurrentProcessFilePath);
            Console.WriteLine("Admin App Running As: " + trustedClass.WindowsIdentityCurrentName);
            Console.WriteLine("Admin App Is64BitProcess: " + trustedClass.Is64BitProcess);
            Console.WriteLine("Admin App DoSomethingAsAdmin: " + trustedClass.DoSomethingAsAdmin());
        }
    }
}
Is64BitProcess False
Running As SMO01\simon
Admin App Process Path: C:\WINDOWS\system32\dllhost.exe
Admin App Running As: SMO01\myAdmin
Admin App Is64BitProcess: True
Admin App DoSomethingAsAdmin: 71
Is64BitProcess False
Running As SMO01\bob

Unhandled Exception: System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {0DC1F11A-A187-3B6D-9888-17E635DB0974} failed due to the following error: 80070005 Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)).
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at UserApp.Program.Main(String[] args) in C:\Users\simon\source\repos\TrustedSystem\UserApp\Program.cs:line 14