我有一个自定义编写的Windows服务,我在许多Hyper-V VM上运行.作为正在运行的一些自动化测试的一部分,VM每小时重启几次.该服务设置为自动启动,几乎所有时间,它启动正常.
但是,也许有5%的时间,没有我能辨别的模式,服务无法启动.当它失败时,我在事件查看器中收到错误说
等待我的服务名称服务连接时达到超时(30000毫秒).
发生这种情况时,我可以手动启动服务,或者重新启动,服务将正常启动.
我无法弄清楚的是,我的代码中似乎没有发生30秒的超时.我的服务类的OnStart()方法的第一行将"Starting ..."记录到其log4net日志中.当服务无法启动时,我甚至都没有记录任何内容,这表明log4net无论出于何种原因都无法登录,或者在我的OnStart()被调用之前发生了超时.
该服务运行在各种操作系统上,从XP一直到Win7和2008R2,我知道将服务设置为延迟启动可以解决这个问题,对于Vista及更高版本,但这似乎是一个黑客.
我无法对此进行远程调试,因为它间歇性地发生并且在系统启动期间,我不知道如何进一步尝试弄清楚发生了什么.有任何想法吗?
我有3台Linux机器,并希望通过某种方式将dotfiles保持在主目录中同步.有些文件,如.vimrc,在所有3台机器上都是相同的,有些文件对每台机器都是唯一的.
我之前使用过SVN,但关于DVCS的所有嗡嗡声让我觉得我应该尝试一下 - 是否有一个特别适合这个?或者我应该坚持使用SVN?
我有一个运行为mydomain\userA的Windows服务.我希望能够从服务中运行任意.exes.通常,我使用Process.Start()并且它工作正常,但在某些情况下我想以不同的用户(mydomain\userB)运行可执行文件.
如果我更改ProcessStartInfo,我用来启动进程以包含凭据,我开始收到错误 - 或者是一个错误对话框,显示"应用程序无法正确初始化(0xc0000142).单击确定以终止应用程序."或者"访问被拒绝"Win32Exception.如果我从命令行运行进程启动代码而不是在服务中运行它,则进程将使用正确的凭据开始(我已通过设置ProcessStartInfo来运行whoami.exe并捕获命令行输出来验证这一点) ).
我也尝试使用WindowsIdentity.Impersonate()进行模拟,但这没有用 - 据我所知,模拟只会影响当前线程,启动新进程会继承进程的安全描述符,而不是当前线程.
我在一个独立的测试域中运行它,因此userA和userB都是域管理员,并且两者都在域范围内具有"登录即服务"权限.
使用WPF的内置UI自动化,将左键单击事件发送到AutomationElement(例如Button)很容易(尽管非常详细):
InvokePattern invokePattern = (InvokePattern) element.GetCurrentPattern(InvokePattern.Pattern);
invokePattern.Invoke();
Run Code Online (Sandbox Code Playgroud)
但是,似乎没有内置方法可以向同一元素发送右键单击.我已经辞职了,使用P/Invoke调用SendInput,但我无法让它工作.使用下面的代码,当我调用RightClick()时,会在光标所在的位置弹出一个上下文菜单,而不是在我希望右键单击的元素上.所以它似乎忽略了我交给的坐标,只是使用了当前的光标位置.
public static void RightClick(this AutomationElement element)
{
Point p = element.GetClickablePoint();
NativeStructs.Input input = new NativeStructs.Input
{
type = NativeEnums.SendInputEventType.Mouse,
mouseInput = new NativeStructs.MouseInput
{
dx = (int) p.X,
dy = (int) p.Y,
mouseData = 0,
dwFlags = NativeEnums.MouseEventFlags.Absolute | NativeEnums.MouseEventFlags.RightDown,
time = 0,
dwExtraInfo = IntPtr.Zero,
},
};
NativeMethods.SendInput(1, ref input, Marshal.SizeOf(input));
input.mouseInput.dwFlags = NativeEnums.MouseEventFlags.Absolute | NativeEnums.MouseEventFlags.RightUp;
NativeMethods.SendInput(1, ref input, Marshal.SizeOf(input));
}
internal static class NativeMethods
{
[DllImport("user32.dll", SetLastError …Run Code Online (Sandbox Code Playgroud)