IUrlHistoryStg2::ClearHistory() メソッドは、ユーザーごとに文書化されています。
http://msdn.microsoft.com/en-us/library/aa767715(VS.85).aspx
SYSTEM アカウントで実行されているサービスから呼び出すと、特定のログオン ユーザーをターゲットにすることができません。WindowsIdentity.Impersonate() を介してユーザーの偽装に成功しましたが、ClearHistory() への呼び出しは成功に対して常に 0 を返しますが、ユーザーの履歴はクリアされません。
これは XP と Win7 の両方に当てはまるため、セッション分離の問題ではないようです。
おそらくそれは COM であるため、偽装するときに呼び出し元のスレッド トークンではなく、呼び出し元のプロセス トークンを見ていますか?
ユーザーのなりすましが単にこの方法の成功につながらないのはなぜですか?
using System;
using System.Runtime.InteropServices;
/**
* wrapper for IUrlHistory
*/
public struct STATURL
{
public static uint SIZEOF_STATURL = (uint)Marshal.SizeOf( typeof(STATURL) );
public uint cbSize;
[MarshalAs(UnmanagedType.LPWStr)] public string pwcsUrl;
[MarshalAs(UnmanagedType.LPWStr)] public string pwcsTitle;
public System.Runtime.InteropServices.ComTypes.FILETIME
ftLastVisited,
ftLastUpdated,
ftExpires;
public uint dwFlags;
}
[ComImport, Guid("3C374A42-BAE4-11CF-BF7D-00AA006946EE"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IEnumSTATURL
{
[PreserveSig]
uint Next(uint celt, out STATURL rgelt, out uint pceltFetched);
void Skip(uint celt);
void Reset();
void Clone(out IEnumSTATURL ppenum);
void SetFilter(
[MarshalAs(UnmanagedType.LPWStr)] string poszFilter,
uint dwFlags);
}
[ComImport, Guid("AFA0DC11-C313-11d0-831A-00C04FD5AE38"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IUrlHistoryStg2
{
#region IUrlHistoryStg methods
void AddUrl(
[MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
[MarshalAs(UnmanagedType.LPWStr)] string pocsTitle,
uint dwFlags);
void DeleteUrl(
[MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
uint dwFlags);
void QueryUrl(
[MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
uint dwFlags,
ref STATURL lpSTATURL);
void BindToObject(
[MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
ref Guid riid,
[MarshalAs(UnmanagedType.IUnknown)] out object ppvOut);
IEnumSTATURL EnumUrls();
#endregion
void AddUrlAndNotify(
[MarshalAs(UnmanagedType.LPWStr)] string pocsUrl,
[MarshalAs(UnmanagedType.LPWStr)] string pocsTitle,
uint dwFlags,
[MarshalAs(UnmanagedType.Bool)] bool fWriteHistory,
[MarshalAs(UnmanagedType.IUnknown)] object /*IOleCommandTarget*/
poctNotify,
[MarshalAs(UnmanagedType.IUnknown)] object punkISFolder);
void ClearHistory();
}
[ComImport, Guid("3C374A40-BAE4-11CF-BF7D-00AA006946EE")]
public class UrlHistory /* : IUrlHistoryStg[2] */ {}
public class test
{
static void Main()
{
IUrlHistoryStg2 stg = (IUrlHistoryStg2) new UrlHistory();
stg.ClearHistory();
}
}