Is there a way to programically (probably python?) to get the path property of a service published to an ArcGIS Server?
I found this piece of python:
for dir in [None] + SD.folders:
for srv in SD.list(folder=dir):
print(str(srv.properties))
It gets properties of the services (seems to be the same as you can get by going to the rest end point), but none of these properties is the original mxd path..
Solved! Go to Solution.
Give the following code a try, but it only works in ArcGIS API for Python < 1.8.0. There is a defect in the 1.8.x release that messes up the connection objects for stand-alone GIS servers.
from arcgis.gis.server import Server
from getpass import getpass
import json
url = # URL to ArcGIS Admin API, e.g., https://fqdn:port/arcgis/admin
username = # username of user with administrative privileges
server = Server(url=url, username=username, password=getpass(), verify_cert=False)
sm = server.services
svcs = (
svc
for fld in sm.folders
for svc in sm.list(fld)
if fld not in ['System', 'Utilities']
)
for svc in svcs:
name = svc.serviceName
manifest = json.loads(svc._service_manifest())
if manifest.get("code", 200) == 200:
mxd_path = manifest["resources"][0]["onPremisePath"]
else:
mxd_path = "Service does not include path information."
print("{:<40}{}".format(name, mxd_path))
What I have done in the past and seen explained elsewhere is going to the services directories on the machine your GIS Server is installed on. That's provided you have access to that. Typically you will find the path to the original MXD there:
EXAMPLE
\<arcgisserver_install_dir>\directories\arcgissystem\arcgisinput\<service_folder>\<service_name>.MapServer\extracted\manifest.json
JSON would look something like this:
{"databases":[{
"byReference":true,
"onServerWorkspaceFactoryProgID":".,...",
"onServerConnectionString":"....",
"onServerName":"....",
"onPremisePath":"",
"datasets":[{"onServerName":" ...."}]
}],
"resources":[{"onPremisePath":"<<<<<<<path to .MXD file>>>>>>>",
"clientName":"....",
"serverPath":"<path to .msd file>"}
]}
Thank you Arne Gelfert. Unfortunately we don't have access to the actual machine. It is run for us by ESRI.
Give the following code a try, but it only works in ArcGIS API for Python < 1.8.0. There is a defect in the 1.8.x release that messes up the connection objects for stand-alone GIS servers.
from arcgis.gis.server import Server
from getpass import getpass
import json
url = # URL to ArcGIS Admin API, e.g., https://fqdn:port/arcgis/admin
username = # username of user with administrative privileges
server = Server(url=url, username=username, password=getpass(), verify_cert=False)
sm = server.services
svcs = (
svc
for fld in sm.folders
for svc in sm.list(fld)
if fld not in ['System', 'Utilities']
)
for svc in svcs:
name = svc.serviceName
manifest = json.loads(svc._service_manifest())
if manifest.get("code", 200) == 200:
mxd_path = manifest["resources"][0]["onPremisePath"]
else:
mxd_path = "Service does not include path information."
print("{:<40}{}".format(name, mxd_path))
Thank you Joshua Bixby, your code worked a trick and I got exactly what I needed. Is there a documentation on that somewhere? would be great to see what else I can do. Thanks again!
In terms of the ArcGIS API for Python, reviewing arcgis.gis.server module — arcgis 1.8.2 documentation would be good. Unfortunately, most of the Guide and Sample Notebooks focus on federated ArcGIS Enterprise deployments, so they don't apply well to stand-alone ArcGIS Enterprise deployments. The product team for ArcGIS API for Python has taken a different approach to documentation than other Esri product teams, so their documentation has a different structure and different levels of content than other Esri documentation. Personally, I think it is a step backwards both in structure and content.
Since the ArcGIS API for Python is mostly a Python wrapper for the ArcGIS REST API | ArcGIS for Developers , I encourage you to learn as much about the REST API as you can because I often find myself learning the API for Python by working backwards from the REST API. For administrative options, you would want to read up on the Administrator API of the ArcGIS REST API.
@JoshuaBixby this worked a treat for me and saved me poring over the cursed python api documentation, thanks!