我正在编写一个小型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问题:)以任何方式运行“替换shell”作为升级过程而不必禁用UAC?
答案 0 :(得分:2)
更改用户密码是一项高权限操作,因为您不希望任何恶意代码在您不知情的情况下擦除现有凭据。您可以使用
从命令提示符执行程序
runas /user:<a-priviliged-user> <your-program>.exe
。它将提示您输入特权用户的密码。
答案 1 :(得分:1)
这有点像一个小屋,但看看this page(虽然它来自Vista时代,它仍然相关)。
您的想法是使用嵌入式凭据创建计划任务,以使用足够的凭据运行应用程序,但实际上并未计划运行任务。然后,您可以使用以下命令(例如,在登录期间)运行它:
\windows\system32\schtasks.exe /run /tn "task name"
正如我所说:一个小屋,但它可能足以满足您的要求 - 该程序将以管理员权限运行,而不会提示UAC。
编辑:我刚刚在Server 2012上试过这个,由于某些原因我无法让交互式运行的测试控制台应用程序(即用户可以看到程序正在运行)。我可能只是我,但可能是Server 2012中的行为发生了变化,如果您需要与用户进行交互,这个技巧可能不适合您的需求。答案 2 :(得分:0)
向您的程序集添加清单以通过UAC(用户帐户控制)
在VS2010
中,您可以将清单文件添加到项目中。解决方案资源管理器上的Right click your project
文件,选择Add
,然后选择New item
。在那里你可以找到Application Manifest File
。
修改它以便获得以下之一:
VS2010还附带了2个可用于此的工具: