技术团队不想授予所有用户计算机的管理员权限。 但这些用户仍然应该能够自行更新一个软件。 因此,在该软件内部,应该启动另一个具有管理员权限的软件。 他们将设置一名管理员用户,该用户将对所有计算机拥有管理员权限。然后代码应该使用此管理员用户及其密码来模拟管理员。因此它应该以另一个用户身份启动更新软件。
我尝试这样做,但当我尝试使用管理员权限运行时,它仍然要求输入用户名和密码。 我已经检查过 System.Security.Principal.WindowsIdentity.GetCurrent().Name;返回代码内的用户管理员用户名。所以它确实冒充了另一个用户。
问题是,在窗户内也可能吗? 如何以管理员身份运行,并且只出现UAC提示,而不询问用户和密码?
我冒充这个
SafeAccessTokenHandle safeAccessTokenHandle;
bool returnValue = LogonUser(user, domain, password,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
out safeAccessTokenHandle);
然后以这种方式运行其他进程。
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
WindowsIdentity.RunImpersonatedAsync(
safeAccessTokenHandle,
async () =>
{
try
{
await RunProcessAsync("XYZ.exe","", true);
}
catch (Exception e){
Console.WriteLine(e.Message);
}
}
);
}
static Task<int> RunProcessAsync(string fileName, string arguments = "", bool runAsAdmin = false)
{
var tcs = new TaskCompletionSource<int>();
var process = new Process
{
StartInfo = { FileName = fileName, Arguments = arguments, UseShellExecute = true, LoadUserProfile = true },
EnableRaisingEvents = true
};
if (runAsAdmin) process.StartInfo.Verb = "runas";
process.Exited += (sender, args) =>
{
tcs.SetResult(process.ExitCode);
process.Dispose();
};
process.Start();
return tcs.Task;
}
我尝试冒充管理员用户 然后使用管理员权限运行另一个程序,用户所要做的就是同意 UAC 提示。 我本来希望能够在不询问用户名和密码的情况下运行,但它仍然询问。
编辑
它似乎有效,但如果从 .net 框架应用程序调用,这段代码将无法工作。它仍然会要求输入登录名和密码。 但如果您从 .NET 6 应用程序调用,它就会起作用。然后它会冒充管理员,然后只会进行 UAC 提示是或否。