C# C计划获胜';以非管理员身份运行时无法启动

C# C计划获胜';以非管理员身份运行时无法启动,c#,C#,首先,我没有任何C#技能或经验。我的一个朋友在大学里上了几门课,能够给我在这个C#计划中所学到的东西 我让我的朋友创建一个程序,该程序将查看当前登录用户的全名的WMI,然后查看RegisterDowner值。如果全名与RegisteredDowner相同,则程序退出(全部静默);如果全名与RegisteredDowner不同,则程序将启动一个包含一些文本和yes/no选项的表单。如果用户单击“是”,则程序将RegisterDowner值设置为登录用户的全名,如果用户单击“否”,则程序退出 他完全

首先,我没有任何C#技能或经验。我的一个朋友在大学里上了几门课,能够给我在这个C#计划中所学到的东西

我让我的朋友创建一个程序,该程序将查看当前登录用户的全名的WMI,然后查看RegisterDowner值。如果全名与RegisteredDowner相同,则程序退出(全部静默);如果全名与RegisteredDowner不同,则程序将启动一个包含一些文本和yes/no选项的表单。如果用户单击“是”,则程序将RegisterDowner值设置为登录用户的全名,如果用户单击“否”,则程序退出

他完全满足了我的要求,但它只有在由具有本地管理员权限的用户运行时才能运行,不幸的是,在我的环境中,没有用户是他们机器上的本地管理员。当我向他提出这个问题时,他不确定他能做些什么来解决这个问题,在研究了一整天之后,恐怕没有什么可以做的来解决这个问题,并允许使用本地用户权限启动程序

所以我想问你的问题是,你知道我们可以用另一种方式来使用这个程序,允许它由没有本地管理员权限的用户运行吗?我希望将可执行文件存储在PC上的某个本地位置,然后将其存储在启动项列表中,以便启动启动项列表中的某些内容。也许有一种方法我可以使用一个具有非本地管理员权限的可执行文件,然后让它与在系统帐户下运行的windows服务一起工作

当由非本地管理员运行时,启动脚本时不会发生任何事情

下面是代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
using System.Security.Principal;
using Microsoft.Win32;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        bool compare;

    public Form1()
    {
        InitializeComponent();

        if (PreLoad())
            compare = true;
        else
        {
            this.Text = GetUser();
            compare = false;
        }
    }

    private bool PreLoad()
    {
        string temp = GetCaption(GetUser());

        RegistryKey regKey1 = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
        string keyString = regKey1.GetValue("RegisteredOwner").ToString();

        if (temp == keyString)
            return true;
        else
            return false;

    }
    private void btnYes_Click(object sender, EventArgs e)
    {
        MessageBox.Show("Are you sure?", "Confirmation",MessageBoxButtons.OKCancel);

        string temp = GetCaption(GetUser());
        DoRegistryEdit(temp);
        lblShowAll.Text = "-Successfully registered the machine to: " + temp + " -";

        //Refreshes the screen so that the status message displays
        this.Refresh();

        Thread.Sleep(5000);

        this.Close();
    }

    private void btnNo_Click(object sender, EventArgs e)
    {
        //MessageBox.Show("Better change computers then!");

        this.Close();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        if (compare)
            this.Close();
    }

    public string GetCaption(string userName)
    {
        String QueryStringTemp = "Select * from Win32_NetworkLoginProfile where Caption = '" + userName +"'";
        System.Management.ObjectQuery oQuery = new ObjectQuery(QueryStringTemp);
        ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oQuery);

        ManagementObjectCollection oReturnCollection = oSearcher.Get();

        string capturedResults = "";

        foreach (ManagementObject oReturn in oReturnCollection)
        {
            capturedResults += oReturn["FullName"].ToString();
        }
        return capturedResults;
    }
    public string GetUser()
    {
        System.Management.ObjectQuery oQuery = new ObjectQuery("Select * from Win32_ComputerSystem");
        ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oQuery);

        ManagementObjectCollection oReturnCollection = oSearcher.Get();

        string capturedResults = "";

        foreach (ManagementObject oReturn in oReturnCollection)
        {
            capturedResults += oReturn["UserName"].ToString(); 
        }

        int hold = capturedResults.IndexOf("\\");
        capturedResults = capturedResults.Substring(hold + 1);
        return capturedResults;
    }


    public void DoRegistryEdit(string name)
    {
        RegistryKey masterKey = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
        if (masterKey == null)
            MessageBox.Show("Null Master Key!");
        else
        {
            try
            {
                masterKey.SetValue("RegisteredOwner", name);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Uh OH!" + ex);
            }
            finally
            {
                masterKey.Close();
            }
        }
    }
}
}


任何意见和建议将不胜感激

WMI是这里的杀手。我认为WMI的整个“管理”部分强制它在管理空间中运行

我在网上找到了这个资源:

我对它进行了测试,以确保它在我的Win7 X86机器上运行良好。从网络上的其他来源来看,这对于最新版本的Windows应该是好的,包括一些移动版本


祝你好运

WMI是这里的杀手。我认为WMI的整个“管理”部分强制它在管理空间中运行

我在网上找到了这个资源:

我对它进行了测试,以确保它在我的Win7 X86机器上运行良好。从网络上的其他来源来看,这对于最新版本的Windows应该是好的,包括一些移动版本


祝你好运

一个好的开始是告诉我们当由非管理员用户运行时出现了什么问题,并提供您当前实现的代码。一个好的开始是告诉我们当由非管理员用户运行时出现了什么问题,并提供您当前实现的代码。