就像可以使用
ExecAsOriginalUser
使用启动/登录用户的凭据来运行某些内容一样,是否有命令或方法可以以特定用户身份运行特定的代码段?
为了进一步解释,我在安装结束时将计算机名称写入文件共享的日志中。只要不使用服务器上没有匹配的本地管理员帐户的本地管理员帐户进行安装,此操作就可以完美运行。因此,我需要做的是将写入日志的特定代码作为特定用户帐户执行,我拥有该帐户的凭据,我知道服务器上存在该帐户。
我使用的代码如下:
{ Auto audit the computer name }
procedure AutoAudit();
var
strComputerName: TArrayOfString;
strAutoAuditFile: String;
begin
strAutoAuditFile := '\\' + ClientConnectionPage.Values[0] + '\Audit\Client Audit.txt';
SetArrayLength(strComputerName, 1);
strComputerName[0] :=
ExpandConstant('{computername} ') + GetDateTimeString('dd/mm/yyyy hh:mm', '/', ':');
SaveStringsToFile(strAutoAuditFile, strComputerName, True);
end;
所以,我需要的是一种以另一个用户身份执行
SaveStringsToFile
函数的方法。
我想到了一种相当混乱的方法来做到这一点,这将涉及测试可用的驱动器号,使用帐户凭据映射驱动器,写入文件,然后断开驱动器的连接。但是,我希望有一种更优雅的方法来做到这一点?
LogonUser
WinAPI 函数 才能以不同的帐户运行一段代码。
很可能可以从 Inno Setup 代码运行它,但我还没有找到示例。
或者,您可以开发一个单独的小型应用程序来模拟其他用户并将该应用程序嵌入到您的安装程序中。
Impersonator
类(内部使用 LogonUser
):
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
using (new Impersonator("username", "domain", "password"))
{
string strAutoAuditFile = @"\\" + args[0] + @"\Audit\Client Audit.txt";
string strComputerName =
Environment.MachineName + " " + DateTime.Now.ToString("dd/mm/yyyy hh:mm");
File.WriteAllText(strAutoAuditFile, strComputerName);
}
}
}
从 Inno Setup 运行应用程序,如下所示:
[Files]
Source: "getcompname.exe"; Flags: dontcopy
[Code]
...
var
ResultCode: Integer;
begin
...
ExtractTemporaryFile('getcompname.exe');
ExecAsOriginalUser(
ExpandConstant('{tmp}') + '\getcompname.exe ',
ClientConnectionPage.Values[0],
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);
...
end;
如果您没有控制台应用程序开发经验,请注意,“微型”应用程序甚至可以是使用
runas
命令(不允许自动指定密码)或 PsExec
的批处理文件(确实如此)。