以非管理员身份运行时,C# 程序不会启动
首先,我没有任何 C# 技能或经验。我的一个朋友在大学里参加了几门课程,并且能够向我提供到目前为止我在这个 C# 程序中所学到的知识。
我让我的朋友创建一个程序,该程序将在 WMI 中查找当前登录用户的全名,然后查看 RegisteredOwner
值。如果全名与 RegisteredOwner
相同,则程序退出(全部静默),如果全名与 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();
}
}
}
}
}
任何意见和建议将不胜感激!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
WMI 是这里的杀手。我想 WMI 的整个“管理”部分强制它在管理空间中运行。
我在网上找到了此资源:
我测试了一下,发现它在我的 Win7 X86 机器上运行良好。从网络上的其他来源来看,这对于大多数最新版本的 Windows(包括多个移动版本)来说应该是有好处的。
祝你好运!
WMI is the killer here. I suppose the whole "Management" part of WMI forces it to run in the admin space.
I found this resource on the Web:
I tested it out to see that it worked respectably well on my Win7 X86 box. Judging from other sources on the web, this should be good for most recent versions of Windows, including several mobile editions.
Good luck!