There are two basic ways this can be done and a workaround:
Either you need to modify
/usr/share/polkit-1/actions/org.freedesktop.upower.policy, set the
XDG_SESSION_COOKIE environment variable to the appropriate value or use
Apply this patch:
--- /usr/share/polkit-1/actions/org.freedesktop.upower.policy.orig 2011-11-16 19:06:59.274055248 +0100
+++ /usr/share/polkit-1/actions/org.freedesktop.upower.policy 2011-11-16 19:11:15.178864922 +0100
@@ -21,6 +21,7 @@
<action id="org.freedesktop.upower.suspend"> tag/section), and it'll work too...
When you're using the desktop, you'll see that
$XDG_SESSION_COOKIE has one value, but in an ssh session, it has another. Store
XDG_SESSION_COOKIE e.g. in a .dotfile or something when the desktop starts and source it in your script that needs to do it over ssh.
Or you could just give up on doing it with
UPower and just issue
pm-suspend as root and get it over with! :-)