我有一个应用程序,每次启动时都会检查用户是否存在(如果没有创建).这样做如下:
bool bUserExists = false;
DirectoryEntry dirEntryLocalMachine =
new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
DirectoryEntries dirEntries = dirEntryLocalMachine.Children;
foreach (DirectoryEntry dirEntryUser in dirEntries)
{
bUserExists = dirEntryUser.Name.Equals("UserName",
StringComparison.CurrentCultureIgnoreCase);
if (bUserExists)
break;
}
Run Code Online (Sandbox Code Playgroud)
问题在于部署它的大多数系统.这可能需要6-10秒,这太长了......我需要找到一种方法来减少这种情况(尽可能多).有没有更好或更快的方法来验证系统上是否存在用户?
我知道还有其他方法可以解决这个问题,例如让其他应用程序休眠10秒,或者让这个工具在准备就绪时发送消息等等......但是如果我可以大大减少查找用户所需的时间,它会让我的生活更轻松.
我有一个工具,我用它以编程方式创建本地用户帐户,如下所示:
DirectoryEntry NewUser = dirEntryLocalMachine.Children.Add("UserName", "user");
NewUser.Invoke("SetPassword", new object[] { "Passsord" });
NewUser.Invoke("Put", new object[] { "Description", "Description" });
NewUser.CommitChanges();
Run Code Online (Sandbox Code Playgroud)
该帐户创建正常,但此时用户配置文件不存在(没有HKEY CURRENT USER,没有文档和设置等...),我正在对此进行一些研究,并发现以下MSDN文章说调用LoadUserProfile (...)实际上将创建配置文件,如果它不存在:
如何以编程方式导致创建用户的配置文件
所以我添加了如下代码:
IntPtr hToken = IntPtr.Zero;
bool bLogon = LogonUser(
sName,
sDomain,
sPassword,
LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT,
out hToken
);
PROFILEINFO profileInfo = new PROFILEINFO();
profileInfo.dwSize = Marshal.SizeOf(profileInfo);
profileInfo.dwFlags = 1;
profileInfo.lpUserName = sName;
bool bLoad = LoadUserProfile(hToken, ref profileInfo);
Run Code Online (Sandbox Code Playgroud)
现在,bLogon和bLoad都是正确的,没有异常发生,一切"似乎"工作正常... profileInfo的内容没有更新(我假设字段像.lpProfilePath应该有好的值)和GetUserProfileDirectory()失败找到路径(显然 - 它不存在) - 我也手动检查,新帐户的"文件和设置"下没有任何内容.
任何人都有任何关于我做错的线索?
任何帮助将非常感激.谢谢,
我有一个运行为LocalSystem的C#服务(让我们称之为Serv.exe),我需要这个服务来监控所有注册表访问.
特别是每当它启动的任何进程调用HKEY_CURRENT_USER\Software*.*时,我需要捕获该调用(更改或只是访问),以便我可以相应地重定向它 - 我知道CHANGE事件但是什么关于只是访问注册表以获取值?
推理(因为有人有更好的建议 - 我会更欢迎) - 服务在LocalSystem下运行,它有自己的HKEY_CURRENT_USER但是这个服务用于在登录用户的后台安装软件 - 所以当这个软件安装它可能会试图影响USER本身的HKEY_CURRENT_USER(这很好) - 所以我需要确保这些更改反映到USER而不是LocalSystem帐户.
任何建议,帮助,建议将不胜感激.谢谢,
我正在尝试从 LocalSystem 服务模拟管理员帐户,以便从管理员 HKEY CURRENT USER 注册表获取数据 - 为了模拟,我正在使用由 Uwe Keim 编写的以下站点中找到的 codeproject 代码:Impersonator
我的源代码如下:
using (new Impersonator("user", ".", "pass"))
{
RegistryKey rk = Registry.CurrentUser.OpenSubKey("Software\\CompanyName");
string sValue = rk.GetValue("Value", "").ToString();
rk2.Close();
}
Run Code Online (Sandbox Code Playgroud)
我的期望是 sValue 将来自用户/通行帐户(因为我正在模仿它),但奇怪的是它仍然是来自我的服务正在运行的 LocalSystem 帐户的 sValue ...
关于我做错了什么的任何线索吗?任何帮助将非常感激。谢谢,
我有一个父线程(非UI)创建一些子线程来做一些工作,这些孩子来自不同的类(听起来很奇怪,但代码示例将说明它) - 在某些时候父母必须等待某些任务到由子线程完成 - 这并不意味着孩子已经完成但只是已达到某一点并且父母现在可以继续处理...
显然这是一个例子来说明我的情况...生活不是这么简单:)(对不起重新发布 - 试图将此作为评论添加到我以前的那个,但代码永远不会出来正确)...
class A
{
private ManualResetEvent manualResetEvent;
public A()
{
manualResetEvent = new ManualResetEvent(false);
B child = new B();
if (manualResetEvent;.WaitOne(1000, false))
{
... do the work I was waiting on ...
}
}
};
Class B
{
public B()
{
Thread childThread = new Thread(new ThreadStart(Manage));
childThread.IsBackground = true;
childThread.Name = "NamedPipe Manager";
childThread.Start();
private void Manage()
{
... do some work ...
... call some functions ...
// SIGNAL TO Class …Run Code Online (Sandbox Code Playgroud)