2

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

(这个问题与真正的 crypt 无关,所以如果您不知道那个程序可以。True 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());
     }
}

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

在此处输入图像描述

  1. 当我打开程序 trueCrypt.exe 时,我可以看到该卷实际上已安装。
  2. 我可以看到程序实际上写入了文件 someFile.txt
  3. 路径Y:\存在。换句话说,我可以打开我的电脑并看到驱动器 Y。

现在我的问题是,为什么如果我在 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 服务表现得像控制台应用程序一样?

4

2 回答 2

2

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

来自 MSDN 的代码:

Process.Start(path + "HelloWorld.exe", args, uname, password, domain);
于 2013-06-25T18:09:07.320 回答
2

奥斯汀的答案应该适用于具体情况。但是,如果您只想知道如何在安装时执行此操作,那么您需要使用ServiceProcess.ServiceAccount属性。可以在此处找到具有更多详细信息的示例

您可能想尝试LocalSystemServiceAccount 类型。

于 2013-06-25T18:15:50.873 回答