2

首先,我没有任何 C# 技能或经验。我的一个朋友在大学里上了几门课,并且能够给我到目前为止我在这个 C# 程序中所获得的东西。

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

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

所以我问你的问题是你知道我们可以使用这个程序的另一种方法,它允许它由没有本地管理员权限的用户运行吗?我希望将可执行文件存储在 PC 上本地的某个位置,然后将它放在启动项列表中的启动项列表中启动它。也许有一种方法可以使用具有非本地管理员权限的可执行文件,然后让它与在该System帐户下运行的 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();
                }
            }
        }
    }
}

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

4

1 回答 1

1

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

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

我对其进行了测试,发现它在我的 Win7 X86 机器上运行良好。从网络上的其他来源来看,这应该适用于最新版本的 Windows,包括几个移动版本。

祝你好运!

于 2010-09-01T23:27:45.020 回答