您的位置:首页 > 其它

关于豆丁文库效果的实现(类似百度文库),注册WINDOWS服务,以拒绝分配给IIS过高的权限

2012-07-19 15:16 399 查看
最近应用FLASHPAPER2.2来实现百度文库(豆丁文库)的功能,但是要服务器配置的时候IIS需要配置到管理员的权限才能实现打印。

CSDN讨论地址:http://topic.csdn.net/u/20120717/07/55bb1837-07a7-465b-bc88-895a7c45882a.html

在WEB上给网站如此高的运行权限会有相当大的完全隐患,特别是文档功能需要开放上传功能,安全隐患就更高了。

因此我将文档转换的操作从WEB中分享出来,写成服务注册到服务器上,在服务器上定时进行文档转换。

创建一个新的控制台应用程序,将最下的代码贴入(各有所好,请自我调整)。

并在VS的控制台使用命令

installutil xxx.exe(你的应用程序生成的文件)

来注册服务,卸载服务的命令是 installutil /u xxx.exe(你的应用程序生成的文件)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Configuration.Install;
using System.ServiceProcess;
using System.ComponentModel;
using System.Threading;
using System.IO;

namespace cxfwzx.FlashPrinter
{
class Program : ServiceBase
{
#region 常量
public const string SERVICE_NAME = "文档转换服务";
public const string CUSTOMSRC_NAME = "文档转换服务,用于将可阅读的文档转换成SWF文件";
public const string LOG_NAME = "flashprinter";

#endregion

#region 字段
string foldPath;
TimeSpan interval;
TimeSpan delay;
Timer timer;

#endregion

#region 私有方法
void Reset()
{
interval = TimeSpan.FromSeconds(3600);//默认每小时进行一次,由服务参数第二参数决定单位秒;
delay = TimeSpan.Zero;
}

void ParseArgs(string[] args)
{
foldPath = args.Length > 0 ? args[0] : foldPath;
if (string.IsNullOrEmpty(foldPath))
throw new ArgumentException();
if (args.Length >= 2)
interval = TimeSpan.FromSeconds(Convert.ToInt32(args[1]));
}

void RaiseTimer()
{
timer = new Timer(TimerCallback, null, delay, interval);
}
void TryStopTimer()
{
if (timer != null)
timer.Dispose();
timer = null;
}

/// <summary>
/// 主方法,在此方法中调用FLASHPRINTER进行文档转换
/// </summary>
/// <param name="state"></param>
void TimerCallback(object state)
{
DateTime startTime = DateTime.Now;
//获取目标文件夹下,需要转换的文档文件
DirectoryInfo dir = new DirectoryInfo(foldPath);
List<string> fileList = dir.GetFileList();
WriteLogEntry(String.Format("开始进行文档转换,此次转换总记录{0}条", fileList.Count), false);
int count = 0;
while (fileList.Count > 0)
{
if (Process.GetProcessesByName("FlashPrinter").Count<Process>() > 0)
{
Thread.Sleep(10000); continue;
}
else
{
foreach (var item in Process.GetProcesses()
.Where(u =>
u.ProcessName == "EXCEL" ||
u.ProcessName == "WINWORD" ||
u.ProcessName == "POWERPNT" ||
u.ProcessName == "AcroRd32")

)
{
try
{
item.Kill();
}
catch { }
}
}
string filePath = fileList[0];
fileList.RemoveAt(0);
string swfPath = filePath.Substring(0, filePath.LastIndexOf('.')) + ".swf";
if (!File.Exists(filePath) || File.Exists(swfPath)) { continue; }

FileInfo finfo = new FileInfo(filePath);
int time = ((int)(finfo.Length / (1024 * 1204))) * 20 + 20;
Process pc = new System.Diagnostics.Process();
pc.StartInfo.FileName = "flashprinter";
pc.StartInfo.Arguments = string.Format("{0} -o {1}", filePath, swfPath);
pc.StartInfo.CreateNoWindow = true;
pc.StartInfo.UseShellExecute = false;
pc.StartInfo.RedirectStandardInput = false;
pc.StartInfo.RedirectStandardOutput = false;
pc.StartInfo.RedirectStandardError = true;
pc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
pc.Start();
bool res = pc.WaitForExit(time * 1000);
if (res) { count++; }

pc.Close();
pc.Dispose();
Thread.Sleep(10000);
}
WriteLogEntry(String.Format("文档转换结束,此次成功转换记录{0}条", count), false);

}

void WriteLogEntry(string message, bool error)
{
EventLog.WriteEntry(CUSTOMSRC_NAME, message, error ? EventLogEntryType.Error : EventLogEntryType.Information);
}
#endregion

#region 构造函数

public Program()
{
base.ServiceName = SERVICE_NAME;
base.CanStop = true;
base.CanPauseAndContinue = true;
base.AutoLog = false;
}

#endregion

#region 继承虚方法
protected override void OnStart(string[] args)
{
base.OnStart(args);
Reset();
try
{
ParseArgs(args);
WriteLogEntry(String.Format("开始运行。参数:{0}", String.Join(", ", args)), false);
RaiseTimer();
}
catch (Exception ex)
{
WriteLogEntry("用户参数错误: " + ex.Message, true);
Stop();
}
}

protected override void OnStop()
{
base.OnStop();
WriteLogEntry("停止", false);
TryStopTimer();
}

protected override void OnContinue()
{
base.OnContinue();
WriteLogEntry("继续", false);
RaiseTimer();
}

protected override void OnPause()
{
base.OnPause();
WriteLogEntry("暂停", false);
TryStopTimer();
}

protected override void Dispose(bool disposing)
{
base.Dispose(disposing);

TryStopTimer();
}

#endregion

#region 主函数
static void Main(string[] args)
{
ServiceBase.Run(new Program());
}

#endregion

}

[RunInstaller(true)]
public class MyInstaller : Installer
{
public MyInstaller()
{
ServiceProcessInstaller spi = new ServiceProcessInstaller();
ServiceInstaller si = new ServiceInstaller();
EventLogInstaller ei = new EventLogInstaller();

spi.Account = ServiceAccount.LocalSystem;

si.ServiceName = Program.SERVICE_NAME;
si.StartType = ServiceStartMode.Manual;
si.Description = "文档转换服务用于将文档转换成SWF文件以供阅读";
si.DisplayName = Program.SERVICE_NAME;

ei.Source = Program.CUSTOMSRC_NAME;
ei.Log = Program.LOG_NAME;

Installers.Add(spi);
Installers.Add(si);
Installers.Add(ei);

if (EventLog.SourceExists(Program.CUSTOMSRC_NAME))
EventLog.DeleteEventSource(Program.CUSTOMSRC_NAME);
}
}

public static class fileTemp
{
/// <summary>
/// 获取文件夹下的未生成.SWF的文件
/// </summary>
/// <param name="dir"></param>
/// <returns></returns>
public static List<string> GetFileList(this DirectoryInfo dir)
{
List<string> res = new List<string>();
var fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);
var docList = fileList.Where(u => u.Extension == ".doc" ||
u.Extension == ".docx" ||
u.Extension == ".xls" ||
u.Extension == ".xlsx" ||
u.Extension == ".ppt" ||
u.Extension == ".pptx" ||
u.Extension == ".pdf" ||
u.Extension == ".txt").OrderBy(u=>u.Name);
var swfList = fileList.Where(u => u.Extension == ".swf");
foreach (var item in docList)
{
string fNameNoSuffix = item.Name.Replace(item.Extension, "");
{
if (swfList.Where(u => u.Name.Contains(fNameNoSuffix)).Count() <= 0)
res.Add(item.FullName);
}
}
return res;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: