Inno Setup以另一个用户身份运行/执行代码

时间:2015-02-13 23:03:54

标签: inno-setup elevated-privileges

尽管可以使用ExecAsOriginalUser使用启动/登录用户的凭据来运行某些内容,是否有一个命令或方法可以作为特定用户运行特定代码?< / p>

为了进一步说明,我在安装结束时将计算机名写入文件共享的日志中。只要不使用服务器上没有匹配的本地管理员帐户的本地管理员帐户进行安装,这种方法就可以正常工作。因此,我需要做的是将写入日志的特定代码执行为特定的用户帐户,我知道服务器上存在的凭据。

我使用的代码如下:

//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功能的方式。

我想到了一种相当混乱的方法,这将涉及测试可用的驱动器号,使用帐户凭据映射驱动器,写入文件然后断开驱动器。但是,我希望有更优雅的方式来做到这一点?

1 个答案:

答案 0 :(得分:3)

您必须使用LogonUser WinAPI function将一段代码作为其他帐户运行。

很可能从Inno安装代码运行它,但我没有找到一个例子。


或者,您可以开发一个单独的小应用程序,模拟其他用户并将应用程序嵌入到您的安装程序中。

在C#/ VB.NET中,您可以使用Impersonator class(内部使用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 command(不允许自动指定密码)或{{3 (确实如此)。