首先,我沒有任何C#技能或經驗。我的一個朋友在大學上了幾堂課,並且能夠給我這個C#程序中迄今爲止所獲得的。以非管理員身份運行C#程序時不會啓動
我讓我的朋友創建一個程序,查看當前登錄用戶全名的WMI,然後查看RegisteredOwner值。如果全名與註冊所有者相同,則程序退出(全部爲無聲),如果全名與註冊所有者不同,那麼程序將啓動帶有文本和是/否選項的表單。如果用戶點擊是,那麼程序將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();
}
}
}
}
}
任何意見和建議,將不勝感激!
一個好的開始就是告訴我們什麼時候出現錯誤,當非管理員用戶運行 – pm100 2010-09-01 23:19:43
還提供*代碼*的當前實現。 – TheCloudlessSky 2010-09-01 23:25:51