Also be aware that the feature names for .NET differ between Server and
Server Core.
(Microsoft never makes it easier for us... always more complicated.)
From: "Peter Shirtcliffe"
Sent: Thursday, August 23, 2012 6:59 AM
To: "General discussion for Windo
How does WiX schedule it's custom actions? Normally CA's are scheduled
for deffered no-impersonate but in the case of intermachine sql execution
using SSPI this would result in the computer account (assuming there is a
domain) trying to authenticate to the remote machine rather then the
I've done this type of installer many times before and whoever is giving
you the requirements is off in the weeds.
What you want is an installer with three feature. Web, App, Data. You
run the installer on 'n' number of machines and installing the features as
needed for your deployment sce
Heh, I should have been able to think of that one! LOL
Thanks. You are right, not elegant, but in this case, I'll take it.
My question stands though, I'd like to have a better understanding of ways
to manipulate the UI authoring provided by the extension.
I'm using WiX UI. In one scenarior I'm using Publish elements to insert
ControlEvent rows to get the change I'm looking for. In another scenario I
want to disabled a control? (CustomizeDlg Browse control ).
I'm not being very clever in thinking of a way to do this. I was hoping to
do somethi
er feature that requires full GUI)
will fail.
I do not believe that checks for such OS capabilities should be built in.
Only your application knows what kind of OS capabilities it needs.
Sent from my iPhone
On Jul 24, 2012, at 8:44, "Christopher Painter" wrote:
> I later test
ject: Re: [WiX-users] WiX Internet ShortCuts Error
Never tried, but I think there is no Explorer on Win8 Core so it would not
surprise me if related functionality failed.
On Sat, Jul 21, 2012 at 2:05 PM, Christopher Painter wrote:
Has the internet shortcut extension been tested on Server 8 Core?
I hav
Has the internet shortcut extension been tested on Server 8 Core?
I have an installer that works on Server 2003 / Server 2008 R2 but fails on 8
Core. Don't know if it's because of 8 or because of Core but I'm guessing the
latter.
MSI (s) (20:74) [13:59:40:524]: Executing op:
ActionStart(Name
True, the ServiceInstall element ( which becomes the ServiceInstall table
) doesn't actually do the work, it describes the work to be done by the
underlying standard actions.
This is a subtle difference and I think it's an excellent opportunity to
point out how the WiX documentation about be
Sean-
I have prerequisites for InstallShield (PRQ files) but I can't say that I
use them anymore. MSI 3.1 is included in Server 2003 SP1 and Windows XP
SP3. All of my employers and customers have accepted that if someone
really wants to run a 10 year old operating system that must atleast
I'll give my opinion...
I use a combination of WiX and InstallShield so Merge Modules are my only
viable choice as fragments only work internally to WiX. Generally, if
you are building the merge module in house and consuming it in house, then
I think merge modules have a valid place. Howev
I seem to recall that suppor for 2005 was dropped a couple years ago.
http://robmensching.com/blog/posts/2010/4/28/Change-of-plans-for-WiX-v3.5
From: "Naim Kingston"
Sent: Sunday, June 17, 2012 9:37 PM
To: "wix-users@lists.sourceforge.net"
Subject:
I rewrote my code to use the CabInfo class instead of the CabEngine class
and it works now. I'm not sure what's different other then the resulting
.CAB is 1KB smaller but MSI seems happy now.
----
From: "Christopher Painter"
Sent: Sat
I did a test and used makecab to create the cab file and the installer
worked. So the source of my problem appears to be in using DTF to generate
the CAB. I'm pretty sure that all of my other authoring and streaming is
correct.
From: "C
I'm working on a C#/DTF application that can take a base MSI and among
other things add files to it. I'm using the CabEngine class in DTF to
create the ZIP and various SQL updates to generate rows into the
FeatureComponents, Component, Directory, File and Media tables. I'm also
updating the _
to go.
But if there is a better way, I'm all ears.
----
From: "Christopher Painter"
Sent: Wednesday, June 06, 2012 2:49 PM
To: "General discussion for Windows Installer XML toolset."
, wix-users@lists.sourceforge.net
Subject: R
o schedule the deferred actions and they are after CreateFolder.
So I guess I need to dig deep and figure out technique #2.
----
From: "Christopher Painter"
Sent: Wednesday, June 06, 2012 2:37 PM
To: wix-users@lists.sourceforge.net
Subject:
I have a scenario where I need to lock down a directory so that only system
and a local service account that I'm creating can access it. I'm
encapsulating this in a merge module.
I've tried two techniques:
1) Permission element nested under a CreateFolder element. The problem
with this tec
I'm kind of suprised with Rob's answer. Can you write an install in WiX
that does a minor upgrade of an installer written in IS? Perhaps. It'd
have to be very careful coding to keep all the primary keys and components
the same and get the media built the same way. I suppose it's technicially
Here's one technique that I find useful
Open the MSI in Orca like normal and then create a transform.
Paste your RTF in like normal and then tell it to Generate the transform.
Close orca.
Now you can use WiUseXfm.vbs to apply the transform to similarly created
MSI's.
http://msdn.micro
When I worked for Textron the WiX extensions were a cause for concern also.
See, the "standard custom actions" in some of the WiX extensions and DTF
components aren't used only at compilation and build time but they are also
used at run (install) time. The build output can contain CPL licen
I'm guessing that you are declaring a property in a merge module and trying
to use it in the installer. The merge module will append a .GUID to the
property name unless you give it set the SuppressModularization attribute.
Alternatively you can use the correct property name including .GUID in
Do you want your installer to support silent installation? ( All installers
should. ) If so, realie that the UI sequence doesn't get run during a
silent install therefore your call to the second MSI will never happen.
From: "Vivek Soni"
Sent: Monday
Garbage in, garbage out.
Sorry, couldn't resist. Seriously though, I've never heard on Windows
Installer doing this. Do you have any custom actions that updat the file?
Is it possible the file is corrupted during the build process. ( Hence the
GIGO joke. )
A strange scenario. I think what I'd do is install the per-user installer
as content when I install the per-machine install. Then when the per-user
application get's run, use the content to install the per-user install for
the users profile if it's not already installed. I'm not sure I'd nee
mp; Install Engineer - ESA
Jack Henry & Associates, Inc.(r)
Shawnee Mission, KS 66227
Office: 913-341-3434 x791011
jocoo...@jackhenry.com
www.jackhenry.com
-Original Message-
From: Christopher Painter [mailto:chr...@iswix.com]
Sent: Thursday, March 29, 2012 11:24 AM
To:
I've started playing with Microsoft's new hosted build service and I've
come across some issues. The environment is locked down ( the builds don't
run with administrative priv ) so you can't install software. While I
understand WiX can xcopy deploy to a build envionment, I wanted to also
Only deferred custom actions use the CustomActionData class. Immeadiate
Custom Actions can access properties directly:
var installLocation = session["INSTALLLOCATION"];
Here is what I consider `required` reading on the subject:
http://www.installsite.org/pages/en/isnews/200108/index.htm
--
Take a look at:
http://wix.sourceforge.net/manual-wix3/util_xsd_eventsource.htm
An event source in windows is really just some registry entries. The
EventSource extension is some compiler synatical sugar that simlifies
authoring this. Your Installer class isn't needed and shouldn't be used
Could you use he ActiveSetup registry key instead of the RunOnce key? Is
that monitored also?
http://blogs.flexerasoftware.com/installtalk/2011/11/using-active-setup-to-r
epair-user-settings.html
From: "Peter Hull"
Sent: Tuesday, March 27, 2012 9:31
The checkbox can't be on the setup finished dialog because the installer is
no longer elevated as it's after the installation transaction.
The correct approach would be to put the checkbox in the UI before the
Ready To Install dialog. Have the checkbox set a property and use that
property i
AFAIK, The WiXUtil User element doesn't have this functionality. I think
it can create normal accounts and normal accounts with the LogonAsService
Right. If you want to create service accounts that don't have logon
rights you'll need to write a custom action. ( I hope that I'm wrong. )
BTW
There are ways in GPO but none of them are pretty. Simplest might be to
teach them to use policy to seed the registry with data then use
AppSeach/RegLocator to pull that into properties.
MSSCCM using Collection Variables / Task Sequence variables is more
powerful and easier to use.
I don't know if this is common knowledge but I don't set the MsiLogging
property anymore. There' s a known bug in Windows 7 where Explorer / Shell
can lose reference to the installer log file location and it causes the
installer to crash out.It can manifest itself on uninstall which means
d
REMOVE as a feature tree really doesn't make sense with what I'm doing (
the setup types are license related and shouldn't be shown if the user
doesn't have the right license key ).
------------
From: "Christopher Painter"
Sent: We
I have an installer that has a "setup type" story that drives the
INSTALLLEVEL property through the use of SetInstallLevel control events.
During the initial installation everything works as expected.
Now I've been asked to show this dialog again during the maintenance UI.
I can see in the
amp; Install Engineer - ESA
Jack Henry & Associates, Inc.(r)
Shawnee Mission, KS 66227
Office: 913-341-3434 x791011
jocoo...@jackhenry.com
www.jackhenry.com
-----Original Message-
From: Christopher Painter [mailto:chr...@iswix.com]
Sent: Wednesday, March 14, 2012 11:19 AM
To: General d
I've often wondered this myself and designed my installer per customer
requirements.
I agree, it seems wierd to have MSI state data on one machine registering
resource data on another machine. Still, it does work in situations where
the person doing the installer has DBA rights on the instance
They may not be "supported" but I've done it in InstallShield with and
without a Setup.EXE.
http://www.installsite.org/pages/en/msi/articles/embeddedlang/
The setup.exe with lanuage selection and command line passing to specify
the embedded language transform to use is the officially sup
You might be encountering this:
http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Two-Wierd-Inst
aller-Problems-DTF-and-QuietExec-td7220939.html
From: "hansdegroot"
Sent: Tuesday, March 13, 2012 9:07 AM
To: wix-users@lists.sourceforge.net
I have some MSU's and MSP's that I'm running as part of an SCCM task
sequence and I'm seeing something concerning.
If I run wusa and the MSU interactively ( as either myself or system using
srunas -l ) it completes in 33 seconds.
If I run wusa and the MSU via SCCM it takes 5 minutes.
I'm w
practices when
developing software.
Back to the original question... I can leverage the MSIHashTable for other
reasons if it can be used for all files rather than just non-versioned
files.
So, can the use of the table be "forced" in any way via WiX?
Thanks.
On Thu, Mar 8, 2012 at 9
The the theoretical world, if you are following proper versioning patterns
when building your Versioned PE (Program Executable... DLL,SYS,OCX,EXE et
al ) then you shouldn't need to worry about the hash.
If you aren't ( foo.dll 1.0.0.0 or worse foo.dll version [null] doesn't
uniquely descr
Thankfully those instructions are somewhat easy atleast. Some of these
"how to create an admin install" are horribly complex.
To me, as a paying customer at a very, very large enterprise, it annoys
the hell out of me. Don't make me figure out how to do this for all of the
systems that I s
ut scenario too much and should evaluate that going into the home
stretch.
On Mon, Mar 5, 2012 at 7:06 AM, Christopher Painter
wrote:
Other then being allowing WiX to dogfood Burn, what benefit does the WiX
installer even gain from using Burn? I thought the old Mondo UI looked
just fine an
Other then being allowing WiX to dogfood Burn, what benefit does the WiX
installer even gain from using Burn? I thought the old Mondo UI looked
just fine and it was a simpler 1 MSI story to boot. My experience with
the Burn based WiX installers is that user experience is inferior relative
t
I'd suggest that your boss talk to his own retained or internal counsel.
It's prima facie case to me that the license of a compiler doesn't transfer
to the built object code format of your IP. However, I'm not in the
business, nor do I imagine the WiX team is in the business, of giving legal
The remember property pattern won't help you here since the password value
is encrypted. The best thing I can think of at the moment is to put
conditions on the DeleteServices and InstallServices standard action so
that they don't fire during major upgrade. This is a hack though because
if y
in WiX v3.x that might take a touch more
time like smartcab'ing but I don't expect that accounts for the differences
seen.
On Thu, Feb 16, 2012 at 6:49 AM, Christopher Painter
wrote:
Don't do it!!! I love the fact that validation is enabled by default!!
Get faster hardware
ating the target MSI.
Patching is very finicky. It needs the original and target to match
appropriately. Changing versions of tools (or switching tools entirely!)
when creating those adds variables most tools don't want to debug.
On Thu, Feb 16, 2012 at 6:01 AM, Christopher Painter
wrote
You'd have to use a CustomAction as MSI only has the DuplicateFile table that
can make copies of files that MSI is installing. There is no built-in folder
copying mechanism. You'd also have to handle your own overwrite rules and
rollback/commit processing.
It's usually a better idea to reth
Don't do it!!! I love the fact that validation is enabled by default!!
Get faster hardware
From: "Rob Mensching"
Sent: Wednesday, February 15, 2012 10:16 PM
To: "General discussion for Windows Installer XML toolset."
Subject: Re: [WiX-users]
Funny, I also remember them writing a blog talking about how you could use
WiX to author patches for installers that weren't authored in WiX.
http://blogs.msdn.com/b/pmarcu/archive/2008/05/30/patching-something-you-did
nt-build-with-wix-using-wix-.aspx
Otherwise I agree with you. I have no lo
A merge module is reusable and doesn't know about INSTALLDIR or TARGETDIR.
It know's about ModuleRetargetableDir. When you consume the merge module
in an installer you will use a Merge, MergeRef and Directory element
combination to associate the ModuleRetar.. to INSTALLDIR or INSTALLLOCATION
or insensitiive ~= .
From: "Jeff McCune"
Sent: Tuesday, February 14, 2012 11:20 PM
To: chr...@iswix.com, "General discussion for Windows Installer XML
toolset."
Subject: Re: [WiX-users] How to downcase a public property?
On Tue, Feb 14, 2012 at 7:18 PM, Christopher Pa
If you are really serious about simplying setup and making it bulletproof
you should push back at your application developers and challenge why they
need the hostname to be lower cased. The code that reads the XML should to
it's own .ToLower() if it's that important to them.
Otherwise you'll
I can agree that relying on conditions like Not Installed during custom
actions does not scale. Component Action states are a much better
indicator of when to do something.
My only regret is that MSI never implemented a pattern for hooking into the
resilency process. It would have been nice f
FWIW, I'm a strong advocate of the use of internally generated merge
modules to support decentralized setup development, but I am very, very
wary of using merge modules from third parties. It usually doesn't end
well.
From: "Blair"
Sent: Thursday, Fe
ot;General discussion for Windows Installer XML
toolset."
Subject: Re: [WiX-users] Unit tests with dtf and mockups
Maybe in WiX v4. Not doing those sorts of large changes to non-Burn related
features in WiX v3.6 or v3.7.
On Tue, Nov 29, 2011 at 8:27 AM, Christopher Painter
wrote:
I don
r. That's when I finally discovered exactly what was
happening, and then I was able to stage a repro at will.
I submitted the fix to WiX, and a couple of weeks later walked another
team
through their attempts to verify the fix.
Blair
-Original Message-
From: Christopher Painter
I'm going to be creating a trojan installer that serves as a health check
and deploying it daily to 2200 machines. I'll be able to stress test the
fix made in 3.6 and see what happen.s
From: "Neil Sleightholm"
Sent: Wednesday, January 25, 2012 1:06 PM
Blair,
That is excellent information. Yes, I am on 3.5 currently. I'm no longer
with Overwatch so I can make the call to go to 3.6 much easier.
FWIW, in this install I have 1 immed. DTF CA that costs and then 2 more
CA's that perform uninstall and install actions. The cost CA always wo
Sadly this is a huge huge hole / disconnect between how MSI works and how
XML works. MSI treats a Registry Value and File as atomic but an XML file
is not atomic. Elements, Attributes and Values are atomic.
The simplest way, assuming Unity can do this, is to layer your
configuration data i
I have a small utility that I find useful in registering COM. Basically it
puts a filesystem watcher on a directory and runs heat whenever it see's a
change.
Basically I drop a DLL/OCX into the directory and if I don't see COM
elements I open up depends and start copying in all of it's depe
I read through that and yes I see a similarity. In my situation another
ManagedCA ( the part the does the costing and sets the CAD property ) ran
successfully. Then along comes the deferred CA and while it does start
executing it mysteriously dies.
Very interesting. And I'm sure Jason has
;value 3", no logs, exception or anything useful - run again and it
is fine. I started to think the problem was in DTF but I never got a good
enough repro to debug it.
Neil
-Original Message-
From: Christopher Painter [mailto:chr...@iswix.com]
Sent: 24 January 2012 16:35
T
I have an installer that I wrote that I've been pushing out through SCCM.
We have deployed to about 600 servers so far and so far I've seen 6
failures. There are 3 of one failure mode and 3 of another.
1) C# DTF terminates with 1603
This one is wierd. It's a deferred CA that get's it's C
I find it more elegant to have the custom action only set a property and
return. Then on the remaining control events use the property in a
condition to perform a SpawnDialog on a custom dialog that displayes the
error message. This way MSI continues to handle the UI.
--
lication is not occurring at all
therefore not getting to the repair portion. As I said though I'll try it
again on a clean machine just to be %100 sure.
Although Phil stated that it had to be with an advertised shortcut which in
my case I am NOT doing... Chris are you saying that is ne
do anything with the dependent library. When the two files
reside in the same component, the installation fails with the following
error.
An error occurred during the installation of assembly 'MyHelper.dll,
version="1.0.0.0", culture="neutral", publicKeyToken="&
ng
> error.
>
> An error occurred during the installation of assembly 'MyHelper.dll,
> version="1.0.0.0", culture="neutral", publicKeyToken=""'. Please
refer
> to Help and Support for more information.
>
> Thanks,
> Daniel
>
I haven't done this with WiX but I have done it with InstallShield. In
that case instead of making the unmanaged DLL a keyfile of it's own
component I made it a companion file of the managed assembly that was being
installed to the GAC.
In that situation MSI and/or .NET (fusion API) figured o
27;m sorry if I was unclear or if I was clear and now I'm just confusing
myself. :-)
----
From: "Christopher Painter"
Sent: Friday, January 13, 2012 2:33 PM
To: "Wilson, Phil" , "General discussion for
Windows Installer XML
on is Windows 7 64 Bit. The installing user is
also in the local admin group but the others users are not.
Jon
-Original Message-
From: Christopher Painter [mailto:chr...@iswix.com]
Sent: Thursday, January 12, 2012 7:12 PM
To: Dan Gough; General discussion for Windows Installer XML to
My memory of the way Java stores there version information in the registry
isn't very friendly to MSI's RegLocator pattern. You might need a custom
action.
From: "T. Kuro Kurosaka"
Sent: Thursday, January 12, 2012 6:21 PM
To: wix-users@lists.sourcefo
Thu, Jan 12, 2012 at 9:34 PM, Christopher Painter
wrote:
The Registry element has a Root attribute that you can set to HKCU. If
your program has an advertised shortcut you can use this to trigger
resilency to complete the installation for each user who uses your app.
It's an ugly st
The Registry element has a Root attribute that you can set to HKCU. If
your program has an advertised shortcut you can use this to trigger
resilency to complete the installation for each user who uses your app.
It's an ugly story though like the old Office install that popped up every
time y
e: [WiX-users] Add Domain Group to Local Group
Didn't know the User element could find groups. That's probably some
accidental side effect.
Creating groups is another thing that would be nice if someone implemented.
Rollback on it is really, really hard, IIRC.
On Sat, Jan 7, 2012 at
m actions to do this.
----
From: "Christopher Painter"
Sent: Saturday, January 07, 2012 11:28 AM
To: "Rob Mensching" , "General discussion for Windows
Installer XML toolset."
Subject: Re: [WiX-users] Add Domain Group to Local Group
ws Installer XML
toolset."
Subject: Re: [WiX-users] Add Domain Group to Local Group
That's all that is supported today. It would be fantastic if you wanted to
contribute the code to do more.
On Tue, Jan 3, 2012 at 2:18 PM, Christopher Painter
wrote:
I work in an enterprise envi
IMO, in certain situations, merge modules are not quite dead. Here's my
opinion:
http://blog.iswix.com/2010/09/in-defense-of-merge-modules.html
If you are staying in a WiX world, yes, wixlibs and fragments are a better
solution. If you are using a combination of tools such as WiX and
Insta
ect: Re: [WiX-users] Querying the package andinstalled
productarchitecture
Native C++.
-Original Message-
From: Christopher Painter [mailto:chr...@iswix.com]
Sent: Friday, January 06, 2012 11:23
To: General discussion for Windows Installer XML toolset.; General
discussion for Wi
There are methods on the automation objects that you can call to resolve a
product code that machines and upgrade code then get the file path to the
cached MSI for that product code and then open the database to get access
to the summary information stream and then access the template summary
p
This is a known bug in Windows Installer. ( See MS KB2564571 ) I've
personally seen it on Windows 7 but I haven't seen it on Vista.I
personally no longer set the MsiLogging property since the functionality
can't be trusted to actually work. The KB has a possible workaround if
you are stuc
security) process matters, where 3rd party
code must have a support contract and pass security audits and so on. It's
ok to use these types of tools for internal development but shipping them
to customers is not allowed. So knowing how to P/Invoke or use native Win32
APIs is necessary.
h, and then get each record's string data.
In this particular SummaryInfo case, WiSumInf.vbs is quite instructive on
how to get the SummaryInfo for the Platform. I'm not a language purist to
the extent that I'll ignore a working example, whatever language it might
be!
Phil W
I work in an enterprise environment and I have a request to add an Active
Directory Group to a Local Group. Problem is I see the util::GroupRef
element only allows util::User as a parent and not util::Group as a parent.
I'd like to be able to run this MSI through SCCM and pass Domain/Name in
, and Happy new year!
Am 31.12.2011 02:56, schrieb Christopher Painter:
>
>
> It's nearly 2012 and I'd much rather use C# and DTF. Perhaps in 1999
those
> VBScript files were interesting and useful. I can understand the msi.h
/
> msi.lib is still good for the unmanage
It's nearly 2012 and I'd much rather use C# and DTF. Perhaps in 1999 those
VBScript files were interesting and useful. I can understand the msi.h /
msi.lib is still good for the unmanaged C++ guys out there and is certainly
the foundation for DTF but the whole VBScript / ActiveScript / COM /
What language(s) are you using?
There are ways to do it via Win32 API, COM Automation and Managed .NET
classes ( that wrap the Win32 API ).
From: "Alex Ivanoff"
Sent: Friday, December 30, 2011 10:21 AM
To: "General discussion for Windows Installer
What you are calling a "common componet" is called a "shared component" in
all of the MSDN docs.A merge module is merely an MSI database that
serves as an encapsulation of a collection of globally unique components.
A merge module with have information like directories, files, registry,
sh
alue
instead.
So, something like the following now works to install/uninstall.
msiexec /qn /i product.msi TRANSFORMS=":US_PROD;" MSINEWINSTANCE=1
msiexec /qn /x product.msi TRANSFORMS=":US_PROD;"
-Original Message-
From: Christopher Painter [mailto:chr...@iswix.com
Please, make sure you do. A Component can have only one KeyFile.
Putting the KeyPath attribute on the component means that the directory of
the component is the key path. Putting it on a file means the file is the
key path. If you try to put it on multiple files inside of a component
you'
At my last job our typical installer had 15,000 files in it. About 12,000
of those files were graphics / content for one our features. I've seen the
performance for 1:1 vs 1:Many component to file relationships and when it
was 1:1 you might as well take the installer out back, put a gun to it
Depends on what kind of files they are and how you plan on servicing them
(patching, upgrades ) Typically these are content type files such as web
content or help content.
But, yes, there are situations where this is acceptable provided that you
understand the implications.
Make sure you are using the MSINEWINSTANCE property also.
BTW, I've never heard of an ability to apply a transform while the install
is running. I always thought you had to apply it when you called the MSI
like you are doing with the TRANSFORMS=":SomeEmbeddedTransform.mst". This
is why I've
I have a customer who has asked that I create a UK English localization for
an existing installer. I have a very high level / broad question that I'm
hoping can be answered by somebody from the other side of the pond.
First, let me apologize in advance if I misuse or otherwise unintentional
i
I do service upgrades all the time. Make sure your service exe is being
properly versioned so that file costing will cause the component/file to be
reinstalled and then set your ServiceControl attributes to stop, remove and
start during the install. This will cause windows installer take care
Unless you really understand COM in depth, authoring all the COM elements
by hand will be a bear. I'd go with the Heat technique. Personally, I've
written a Winform application that monitors a folder and calls heat every
time a change in the directory occurs. The result is then thrown into a
I wasn't aware that you could have a per-user event log as the registry
(HKLM\System\CurrentControlSet\Services\EventLog ) used by the EventLog
service is in HKLM. Therefore I don't se how you could have a per-user
message file.
Am I missing something?
-
201 - 300 of 1115 matches
Mail list logo