2

まず、C# のスキルや経験はありません。私の友人は、大学でいくつかのクラスを受講し、この C# プログラムでこれまでに得たものを私に提供することができました。

私は友人に、現在ログオンしているユーザーのフル ネームを WMI で確認し、そのRegisteredOwner値を確認するプログラムを作成するように依頼しました。フル ネームが と同じ場合RegisteredOwner、プログラムは終了します (すべてサイレント)。フル ネームが と異なる場合RegisteredOwner、プログラムはテキストと yes/no オプションを含むフォームを起動します。ユーザーが [はい]をクリックすると、プログラムはRegisteredOwner値をログオン ユーザーのフル ネームに設定し、[いいえ] をクリックすると、プログラムは終了します。

彼は私が求めていたものを正確に届けてくれました。ただし、ローカル管理者権限を持つユーザーが実行した場合にのみ実行されます。残念ながら、私の環境では、マシンのローカル管理者であるユーザーはいません。私が彼に問題を提示したとき、彼は問題を解決するために何ができるか確信が持てず、一日中調べた結果、問題を解決して許可するためにできることはあまりないのではないかと心配しています.ローカル ユーザーのアクセス許可を使用して起動するプログラム。

では、私の質問は、ローカル管理者権限のないユーザーがこのプログラムを実行できるようにする別の方法を知っていますか? 実行可能ファイルを 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 の「管理」部分全体が、管理スペースでの実行を強制していると思います。

Web で次のリソースを見つけました。

私はテストして、私の Win7 X86 ボックスでかなりうまく機能することを確認しました。Web 上の他の情報源から判断すると、これは、いくつかのモバイル エディションを含む Windows の最新バージョンに適しているはずです。

幸運を!

于 2010-09-01T23:27:45.020 に答える