首先,我没有任何C#技能或经验。我的一个朋友在大学里上了几堂课,并且能够在这个C#课程中给我迄今为止所学到的东西。
我让我的朋友创建了一个程序,该程序将查看当前登录用户的全名的WMI,然后查看RegisteredOwner值。如果全名与注册所有者相同,则程序退出(全部静默),如果全名与注册所有者不同,则程序将启动具有一些文本和是/否选项的表单。如果用户单击“是”,则程序会将注册的用户值设置为登录用户的全名,如果他们单击“否”则退出该程序。
他完全按照我的要求发送了它,但是只有在拥有本地管理员权限的用户运行时才运行,不幸的是在我的环境中没有用户是他们机器上的本地管理员。当我向他提出这个问题时,他不确定他能做些什么来解决这个问题,在整天调查之后我恐怕没有太多办法可以解决这个问题并允许程序使用本地用户权限启动。
所以我的问题是你知道我们可以采用不同的方式使用这个程序,让它由没有本地管理员权限的用户运行吗?我想将可执行文件存储在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();
}
}
}
}
}
任何建议和意见将不胜感激!
答案 0 :(得分:1)
WMI是这里的杀手。我想WMI的整个“管理”部分强制它在管理空间中运行。
我在网上找到了这个资源:
我测试了它,看它在我的Win7 X86盒子上运行得相当好。从网络上的其他来源来看,这应该适用于最新版本的Windows,包括几个移动版本。
祝你好运!