0

我正在编写一个小型 C# (.NET 4) 应用程序,它将在登录到 Windows Server 2012 时作为用户“Shell”的替代品运行。除此之外,我想为用户提供更改他们自己的本地帐户的密码。

使用以下代码..

 DirectoryEntry directory = new DirectoryEntry("WinNT://" + Environment.MachineName + ",computer");
 DirectoryEntry userEntry = directory.Children.Find(username);
 userEntry.Invoke("SetPassword", new object[] { newPassword });

 userEntry.CommitChanges();

...如果代码是从提升的命令提示符启动的,则可以正常工作。但是,由于 Shell 替换作为“普通”应用程序运行,我得到一个

访问被拒绝

代码运行时出现异常,即使用户设置为本地管理员。

是否有任何代码或机制可以用来以编程方式设置用户自己的本地帐户密码而无需提升?或者(我知道这可能更像是一个 ServerFault 问题:)以任何方式将“替换外壳”作为提升的进程运行而无需禁用 UAC?

4

3 回答 3

2

更改用户密码是一项高权限操作,因为您不希望任何恶意代码在您不知情的情况下清除您现有的凭据。您可以使用 . 从命令提示符执行程序
runas /user:<a-priviliged-user> <your-program>.exe。它当然会提示您输入特权用户的密码。

于 2013-01-07T18:02:55.030 回答
1

这有点麻烦,但是看看这个页面(虽然它来自 Vista 时代,但它仍然是相关的)。

这个想法是您创建一个具有嵌入式凭据的计划任务,以使用足够的凭据运行应用程序,但实际上并不计划任务运行。然后,您可以使用以下命令按需运行它(例如在登录期间):

\windows\system32\schtasks.exe /run /tn "task name"

就像我说的:一个笨蛋,但它可能足以满足您的要求 - 该程序将以管理员权限运行,而不会提示输入 UAC。

编辑:我刚刚在 Server 2012 上尝试过,由于某种原因,我无法让测试控制台应用程序以交互方式运行(即用户可以看到程序正在运行)。我可能只是我,但可能是 Server 2012 中的行为发生了变化,如果您需要与用户交互,这个技巧可能不适合您的需求。

于 2013-01-07T19:35:49.220 回答
0

向您的程序集添加清单以通过 UAC(用户帐户控制)

VS2010您可以将清单文件添加到您的项目中。Right click your project解决方案资源管理器中的文件,选择Add,然后选择New item。在那里你可以找到Application Manifest File

修改它,以便您获得以下内容之一:

  1. 普通的
  2. 最高可用(取决于用户权限)
  3. 管理员权限

VS2010 还附带了 2 个工具可供您使用:

  1. MageUI.exe(清单生成和编辑工具,图形客户端)
  2. Mage.exe(清单生成和编辑工具,命令行)
于 2013-01-08T06:12:12.763 回答