C#发布的exe无法在非管理员帐户上启动

时间:2019-05-23 09:06:08

标签: c# powershell admin impersonation

因此,我创建了一个GUI,该GUI使用模拟和powershell命令激活和停用网络适配器。

这是代码段:

Get_adapters获取所有适配器并将它们绑定到列表视图:

    public MainWindow()
    {
        InitializeComponent();
        Get_adapters();
    }

这是我的两个按钮命令:

    private void Activate_interface(object sender, RoutedEventArgs e)
    {
        string interface_name = ((Netadapter)ListView.SelectedItem).Name;
        Change_adapter_status(true, interface_name);
    }

    private void Deactivate_interface(object sender, RoutedEventArgs e)
    {
        string interface_name = ((Netadapter)ListView.SelectedItem).Name;
        Change_adapter_status(false, interface_name);
    }

这是功能强大的方法:(帐户凭据已隐藏;但是我已经多次检查了它们,并且它们是正确的。)

    public void Change_adapter_status(bool _option, string _interface)
    {
        using (new Impersonator("Administrator", "DOMAIN", "pw"))
        {
            var process_info = new ProcessStartInfo();
            process_info.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe";
            process_info.Verb = "runas";

            if (_option == true)
            {
                process_info.Arguments = String.Format("netsh interface set interface „{0}“ enable", _interface);
            }
            else if (_option == false)
            {
                process_info.Arguments = String.Format("netsh interface set interface „{0}“ disable", _interface);
            }
            Process.Start(process_info);
        }
    }

如您所见,我使用模拟方式以管理员用户身份启动Powershell窗口。

在我的计算机上(管理员帐户),所有功能均正常运行。单击按钮,powershell窗口打开并执行其操作。

在其他计算机上(非管理员但位于同一域中,并且可以使用上述代码提供的凭据访问管理员帐户)。exe甚至无法启动。

计算机具有相同的映像(Windows 10),并且目标.net框架也正确。

  

在其他管理员帐户上,exe是可执行的。那到底是什么   exe对于非管理员用户将无法启动?谢谢。

事件输出: -系统

  • 提供程序

    [名称] .NET运行时

  • EventID 1026

    [资格赛] 0

    2级

    任务0

    关键字0x80000000000000

  • TimeCreated

    [SystemTime] 2019-05-23T10:01:14.748998500Z

    EventRecordID 6679

    渠道申请

    计算机PLMC12906.greencorps.intra

    安全

    • EventData

    应用程序:Adapter.exe Framework版本:v4.0.30319说明:进程由于未处理的异常而终止。 Ausnahmeinformationen:System.Runtime.InteropServices.COMException System.Management.MTAHelper.CreateInMTA(System.Type)bei System.Management.ManagementPath.CreateWbemPath(System.String)bei System.Management.ManagementPath..cctor()Ausnahmeinformationen:系统。 System.Management.ManagementScope._Clone(System.Management.ManagementScope,System.Management.IdentifierChangedEventHandler)中的TypeInitializationException .System.Management.ManagementObjectSearcher..ctor(System.Management.ManagementScope,System.Management.ObjectQuery,System.Management.EnumerationOptions) bei System.Management.ManagementObjectSearcher..ctor(System.Management.ObjectQuery)bei Adapter.MainWindow.Get_adapters()bei Adapter.MainWindow..ctor()附加信息:System.Windows.Markup.XamlParseException bei System.Windows.Markup.WpfXamlLoader .Load(System.Xaml.XamlReader,System.Xaml.IXamlObjectWriterFactory,Boolean,System.Object,System.Xaml.XamlObjectWriterSettings,System.Uri)从System.Windows.Ma System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream,System.Windows)rkup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader,Boolean,System.Object,System.Xaml.Permissions.XamlAccessLevel,System.Uri) .Markup.ParserContext,System.Object,Boolean)bei System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream,System.Windows.Markup.ParserContext)bei System.Windows.Application.LoadComponent(System.Uri,Boolean) System.Windows.Application.DoStartup()bei System.Windows.Application。<。ctor> b__1_0(System.Object)bei System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate,System.Object,Int32)bei System。 Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object,System.Delegate,System.Object,Int32,System.Delegate)在System.Windows.Threading.DispatcherOperation.InvokeImpl()在System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System .Object)MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(System.Object)b ei System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System。 Object,Boolean)在System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object)之前在MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext,System.Threading.ContextCallback, System.Windows.Thread.DispatcherOperation.Invoke()bei System.Windows.Threading.Dispatcher.ProcessQueue()bei System.Windows.Threading.Dispatcher.WndProcHook(IntPtr,Int32,IntPtr,IntPtr,Boolean ByRef) bei MS.Win32.HwndWrapper.WndProc(IntPtr,Int32,IntPtr,IntPtr,布尔ByRef)bei MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object) Ø bject,Int32)在System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object,System.Delegate,System.Object,Int32,System.Delegate)附近DispatcherPriority,System.TimeSpan,System.Delegate,System.Object,Int32)bei MS.Win32.HwndSubclass.SubclassWndProc(IntPtr,Int32,IntPtr,IntPtr)bei )在System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)在System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)在System.Windows.Application.RunDispatcher(System。 Object)bei System.Windows.Application.RunInternal(System.Windows.Window)bei System.Windows.Application.Run(System.Windows.Window)bei System.Windows.Application.Run()bei Adapter.App.Main()

3 个答案:

答案 0 :(得分:1)

尝试添加 app.manifest 文件以使用可执行文件进行投影,并在其上设置<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

答案 1 :(得分:0)

您必须使用WindowsIdentity.Impersonate Method 来模拟。

答案 2 :(得分:0)

这就是我最终要做的事情: 我删除了代码的模拟部分,并将其替换为Process.StartInfo()中的内置方法。 这是为非管理员用户配置网络适配器的gui的一部分。随时使用。

public void Change_adapter_status(bool _option, string _interface)
        {
            SecureString password = new SecureString();
            password.AppendChar('p');
            password.AppendChar('a');
            password.AppendChar('s');
            password.AppendChar('s');
            password.AppendChar('w');
            password.AppendChar('o');
            password.AppendChar('r');
            password.AppendChar('d');

            Process p = new Process();
            p.StartInfo.UserName = "Administrator";
            p.StartInfo.Domain = "domain";
            p.StartInfo.Password = password;
            p.StartInfo.FileName = @"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe";
            p.StartInfo.Verb = "runas";
            p.StartInfo.UseShellExecute = false;

            if (_option == true)
            {
                p.StartInfo.Arguments = String.Format("netsh interface set interface „{0}“ enable", _interface);
            }
            else if (_option == false)
            {
                p.StartInfo.Arguments = String.Format("netsh interface set interface „{0}“ disable", _interface);
            }
            p.Start();
            p.WaitForExit();
            Get_adapters(true);
        }