使Windows服务像从特定用户运行一样运行

时间:2013-06-25 18:03:22

标签: c# windows-services

我想创建一个Windows服务来安装和卸载True Crypt卷。

(这个问题不是关于真正的密码,所以如果你不知道那个程序是什么。真正的Crypt只是一个程序,可以让你加密数据。当你解密它然后trueCrypt将创建一个虚拟驱动器,你可以看到未加密的内容。)

以下是我在控制台应用程序中使用的代码:

static void Main(string[] args)
{
        Test();
}

static void Test()
{
    try
    {
        // location where true crypt is installed
        const string trueCryptExeLocation = @"C:\Program Files\TrueCrypt\TrueCrypt.exe";

        // command line arguments to mount a volume located at 'C:\TC Volumes\vol1.tc' where 
        // it's password is 'demo' and it will be mounted on drive letter y
        const string mountVolumeCmd = @"/v ""C:\TC Volumes\vol1.tc"" /ly /q /p demo /f /a";

        // mount the volume on drive letter y
        Process.Start(trueCryptExeLocation, mountVolumeCmd).WaitForExit();

        // write to the volume!
        System.IO.File.WriteAllText("y:\\someFile.txt", "it works");

        // wait 30 seconds before dismounting
        Thread.Sleep(3000);

        // dismount the volume
        Process.Start(@"C:\Program Files\TrueCrypt\TrueCrypt.exe", @"/ly /q /d /f");
     }
     catch (Exception ex)
     {
        // if there is an error write it to disk
        System.IO.File.WriteAllText(@"A:\Dropbox\Eduardo\WindowsNodeService\WindowsNodeService\bin\Debug\startup.txt", ex.ToString());
     }
}

该代码基本上安装了一个卷写入并卸载它。如果我运行该程序,这就是我所看到的:

enter image description here

  1. 当我打开程序trueCrypt.exe时,我可以看到该卷实际已安装。
  2. 我可以看到该程序实际写入了文件someFile.txt
  3. 路径Y:\存在。换句话说,我可以打开我的电脑,看看驱动器Y。
  4. 现在我的问题是为什么如果我在Windows服务上运行相同的代码,它运行方式不同但运行正常,没有错误。

    换句话说,具有以下Windows服务:

    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }
    
        protected override void OnStart(string[] args)
        {
            Test(); // same method as console application
        }
    
        protected override void OnStop()
        {
        }
    
       // etc... Test method implementation
    

    运行该代码运行正常。它写入文件someFile.txt!这很棒。问题是,如果我打开trueCrypt,我看不到那里安装的卷。此外,如果我转到“我的电脑”,我看不到驱动器Y. 如何使我的Windows服务与控制台应用程序一样?

2 个答案:

答案 0 :(得分:2)

奥斯汀的回答应该适用于具体案例。但是,如果您只是想知道如何在安装时执行此操作,那么您希望使用ServiceProcess.ServiceAccount属性。一个包含更多详细信息的示例can be found here

您可能想尝试LocalSystem ServiceAccount类型。

答案 1 :(得分:1)

如果您使用的是.Net 4.5,则可以使用this Process.Start call

来自MSDN的代码:

Process.Start(path + "HelloWorld.exe", args, uname, password, domain);