2010-11-29 62 views
0

IUrlHistoryStg2 :: ClearHistory()方法记录为每个用户。IUrlHistoryStg2 :: ClearHistory()不适用于服务?

http://msdn.microsoft.com/en-us/library/aa767715(VS.85).aspx

当从SYSTEM帐户下运行的服务调用它,我无法针对特定登录的用户。我已经通过WindowsIdentity.Impersonate()成功地模拟了用户,但对ClearHistory()的调用始终返回0,但不会清除用户的历史记录。

这适用于XP和Win7,因此看起来不是会话隔离问题。

也许因为它是COM,当模仿时,有些东西正在查看调用者的Process标记而不是它的Thread标记?

我很困惑,为什么冒充用户不会简单地导致这种方法的成功?

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(); 
    } 
} 

回答

2

如果服务或应用程序模拟用户,则系统不加载用户的配置文件。先尝试致电LoadUserProfile

1

IUrlHistoryStg2最终使用的Wininet API,例如CommitUrlCacheEntryW

微软文档指出:

像时,WinInet API的所有其他方面,此功能不能 从内部的DllMain或构造安全地叫和全局对象的析构函数 。注意WinINet不支持服务器 实现。另外,它不应该从服务中使用。 对于服务器实现或服务使用Microsoft Windows HTTP 服务(WinHTTP)。

我逆转的API,并发现了他们有检查

  • 模拟
  • 从服务

如果任何一个是真实的运转,该API,错误代码0x80070078存在

所以,幸运的是你试图实现的是不可能从一个服务,你必须使用CreateProcessAsUser

相关问题